Ruby 1.9.2 Object.respond_to?: hello && Object.hello выдает ошибку, почему? - PullRequest
0 голосов
/ 23 февраля 2011

Проходя сегодня код, я заметил нечто неожиданное.Это утверждение:

if Object.respond_to?: hello && Object.hello # stuff

дает неопределенную ошибку метода.Но почему?Очевидно, привет не является допустимым методом Object, однако, учитывая оценку короткого замыкания, не следует ли игнорировать Object.hello всякий раз, когда Object.respond_to?: hello is false?

Я заметил это во время игры с Authlogic, пытаясь выяснить, почему класс UserSession должен определять постоянный?в Rails 3.

Спасибо

Ответы [ 4 ]

4 голосов
/ 23 февраля 2011

Отсутствие скобок приводит к проблеме приоритета:

>> Object.respond_to? :hello && Object.hello
NoMethodError: undefined method `hello' for Object:Class
    from (irb):2
    from /Users/john/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'
>> Object.respond_to?(:hello) && Object.hello
=> false
2 голосов
/ 23 февраля 2011

У вас есть проблема с приоритетом, логическое соединение (&&) имеет более высокий приоритет, чем вызов метода, поэтому ваш пример выполняется так:

if Object.respond_to?(:hello && Object.hello)

не так:

if Object.respond_to?(:hello) && Object.hello

что вы и предполагаете.

1 голос
/ 23 февраля 2011

Я полагаю, что вы столкнулись с проблемой порядка оценки. Учтите следующее:

Object.respond_to? :hello && true 
0 голосов
/ 23 февраля 2011

Если вы проверяете состояние чего-либо с помощью оператора if, вы ищете логический ответ.Object.hello не возвращает false, потому что метод не существует.Ваша проверка:

Object.respond_to? :hello

Проверяет этот ответ, хотя.В моем варианте не должно быть никаких причин для второго Object.hello.

...