如何为名称以问号结尾的属性定义setter?

时间:2010-08-12 14:19:34

标签: ruby

我正在尝试添加名为“已启用?”的属性到具有吸气剂和二传手的模型。但是,当我执行以下操作时:

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

我得到syntax error, unexpected '?', expecting '\n' or ';'

我应该做什么呢?

5 个答案:

答案 0 :(得分:10)

是的,ruby语法只允许方法名称中的?,如果它是最后一个字符,那么foo?=无效。如果你想强调的话,你可以做的一件事就是定义enabled?enabledisable(或enable!disable!。他们正在改变方法。)

如果这不符合您的需求,您只需将方法命名为enabled?enabled=,然后让这些名称之间存在轻微的不相关性。

答案 1 :(得分:7)

ruby​​中的方法名称以小写字母或下划线开头,可选地后跟大写和小写字母下划线和digts。方法名称可以选择以问号,感叹号或等号结尾。

所以你不能!

你可以按照通常的ruby惯用法来定义启用如下: -

def enabled?
  @enabled
end

def enabled=(value)
  @enabled = value
end

总结一下。如果要向外界公开属性,请确保您的变量名称允许在方法名称规则的范围内。

答案 2 :(得分:1)

一个小变化是将getter方法设为别名,同时允许enabledenabled?

def enabled
  @enabled
end

def enabled=(value)
  @enabled = value
end

alias_method :enabled?, :enabled

答案 3 :(得分:0)

仅为enabled

命名您的媒体资源

查询方法只是语法糖,它们并不意味着用作属性或实例变量。如果您愿意,也可以为语法糖添加方法enabled?

答案 4 :(得分:0)

我总是将我的布尔变量命名为'is',如'isEnabled'。然后它具有与没有复杂性需求的问号相同的含义。