2010-08-12 4 views
6

Я пытаюсь добавить свойство под названием «enabled?». к модели с геттером и сеттером. Однако, когда я делаю следующее:Как определить сеттер для свойства, имя которого заканчивается знаком вопроса?

def enabled?= value 
    # .. logic goes here .. 
end 

я syntax error, unexpected '?', expecting '\n' or ';'

Что я должен делать вместо этого?

+1

Не используйте знаки препинания в именах переменных. – DanDan

+4

@DanDan: Использование? для булевых геттеров является стандартом в рубине, и не делать этого было бы довольно унииоматичным. – sepp2k

ответ

10

Да, синтаксис ruby ​​позволяет только ? в именах методов, если это последний символ, поэтому foo?= недействителен. Одна вещь, которую вы могли бы сделать, это было бы довольно идиоматично, заключается в определении enabled?, enable и disable (или enable! и disable!, если вы хотите подчеркнуть, что они являются методами мутации).

Если это не соответствует вашим потребностям, вы можете просто назвать методы enabled? и enabled= и просто жить с небольшой несогласованностью между именами.

+0

Информация о том, что обычно означают восклицательные знаки, описана в [ Разница между низом и низом! в Ruby] (http://stackoverflow.com/questions/709229/difference-between-downcase-and-downcase-in-ruby/709271) –

7

Имя метода в рубине начинается с буквы нижнего регистра или подчеркивания, а затем буквы нижнего и нижнего регистра подчеркивания и цифры. Имя метода может необязательно заканчиваться вопросительным знаком, восклицательным знаком или значком равенства.

Так вы не можете!

Вы могли бы следовать обычным рубиновым идиомам определения включена следующим образом: -

def enabled? 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

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

0

Название вашей собственности просто enabled

Методы запроса просто синтаксический сахар, они не значит быть использованы в качестве свойств или переменных экземпляра. Вы можете добавить метод enabled? для синтаксического сахара, если хотите.

0

Я всегда называю свои булевы переменные, начинающиеся с 'is', как в 'isEnabled'. Затем он имеет то же значение, что и знак вопроса без необходимости в сложности.

+3

Лучше следовать стандартам рубинов/рельсов (не кажется «сложным» «для меня - просто? в конце». В противном случае код, который используется совместно с другими разработчиками, будет трудно читать, так как читатель/сопровождающий теперь должен будет использовать ваш подход к коду, а не стандарт, или использовать только то, что еще хуже. Я делал это сам с _yn в конце, пока не узнал лучше. –

+0

Всегда используйте стандарты. Присоединяйтесь к группе, если хотите по-своему. –

1

Одно небольшое изменение будет псевдоним метода геттер, что позволяет как enabled и enabled?:

def enabled 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

alias_method :enabled?, :enabled 
Смежные вопросы