определены? в Ruby работает в IRB, но не в моем файле класса - PullRequest
1 голос
/ 10 ноября 2009

Я писал небольшую реализацию Heap и, создав свой класс Node, заметил странное поведение. Я хотел вызвать defined?(x), чтобы убедиться, что x было определено, а затем проверить, является ли x целым числом, прежде чем сохранять его в переменной класса значения узла. В IRB я могу позвонить defined?(x) и результат равен нулю.

Тем не менее, в классе я пытаюсь это:

def change_value value
  @value = value if defined?(value)
end

и результатом, когда я вызываю change_value со случайной буквой, скажем, 'e', ​​является стандартная неопределенная локальная переменная или ошибка метода. Опять же, в IRB это работает нормально, и мне интересно, есть ли у меня какие-то проблемы со средой или это не «лучший» способ проверить, действительно ли значение есть.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 10 ноября 2009

( Редактировать : с тех пор DigitalRoss очистил форматирование вопроса, поэтому комментарии о форматировании и первоначальной перезаписи могут больше не применяться. ОП.)

Это почти нечитаемый способ написания метода, и он даже не анализируется на моей машине (Ruby 1.8.7).

Полагаю, вы имеете в виду следующее:

def change_value(value)
  @value = value if defined?(value)
end

Это прекрасно работает, когда я звоню, но это неверно. nil и undefined - два разных зверя в Ruby; value будет всегда определяться в этом контексте, потому что это объявленный параметр метода. Я подозреваю, что вы действительно после:

def change_value(value)
  @value = value unless value.nil?
end

Обратите внимание, что некоторые люди просто пишут это как:

def change_value(value)
  @value = value if value
end

потому что nil это «ложь». Тем не менее, эта форма объединяет nil и false, поэтому это не очень хорошая привычка.

1 голос
/ 10 ноября 2009

Это не лучший способ проверить, действительно ли это там. Если change_value вызывается без указания каких-либо параметров, вы получите:

ArgumentError: wrong number of arguments (0 for 1)

Вместо этого вы можете проверить, что value не nil. Конечно, вы можете сделать это различными способами:

if !value.nil?
  #...
end

if value
  # this will be exeuted if value is either not `nil` or not `false`
end

Удачи!

0 голосов
/ 10 ноября 2009

Будет ли это связано с вызовом метода из экземпляра класса, а не экземпляра объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...