Редактировать: три года спустя; времена, они меняются ...
Ответ Джулика - это самый простой и лучший способ решения проблемы в наши дни:
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
.