Изменить: три года спустя; времена меняются…
Ответ Джулика - это самый простой и лучший способ решить проблему в наши дни:
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
Мой ответ на исходный вопрос следует для потомков ...
Краткая версия:
Вы не можете использовать вопросительный знак в имени переменной экземпляра.
Более длинная версия:
Возьмем, например, attr_accessor :foo
- это просто концептуально немного синтаксического сахара для следующего:
def foo
@foo
end
def foo=(newfoo)
@foo = newfoo
end
Кроме того, суффикс вопросительного знака - это в основном просто соглашение, указывающее, что возвращаемое значение метода является логическим.
Наилучшее приближение, которое я могу сделать для того, что вы здесь собираетесь…
class MyClass
def initialize
@awesome = true
end
def awesome?
@awesome
end
end
В этом случае может потребоваться использование attr_accessor
- в конце концов, может быть явно указано, что вы работаете напрямую с логическим атрибутом. Как правило, я сохраняю суффикс вопросительного знака на тот случай, когда я реализую метод, логическое возвращаемое значение которого основано на несколько более сложных условиях, чем просто значение атрибута.
Ваше здоровье!
Изменить, два года спустя, после недавнего комментария:
- Ruby обеспечивает соблюдение определенных соглашений об именах.
У символов в Ruby не может быть вопросительных знаков. Таким образом, вызовы :my_boolean_attribute?
обоих завершатся ошибкой с NameError
. Изменить: неверно, просто используйте синтаксис в кавычках для символа, например, :"my_attribute?"
- Символы неизменяемы, попытка присвоить одному из них выдаст
SyntaxError
.
person
Nick Zadrozny
schedule
11.08.2009