Ruby:布尔属性命名约定和使用

Dan*_*nor 32 ruby attributes conventions boolean-expression

学习红宝石.我的印象是布尔属性应该如下命名:

my_boolean_attribute?
Run Code Online (Sandbox Code Playgroud)

但是,尝试执行以下操作时出现语法错误:

class MyClass
  attr_accessor :my_boolean_attribute?

  def initialize
    :my_boolean_attribute? = false
  end
end
Run Code Online (Sandbox Code Playgroud)

红宝石显然很讨厌"?".这是惯例吗?我究竟做错了什么?

Nic*_*zny 42

编辑:三年后; 时代,他们是a-changin'......

Julik的答案是解决这个问题的最简单,最好的方法:

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end
Run Code Online (Sandbox Code Playgroud)

对于后人,我对原始问题的回答如下:


简短版本:

您不能在实例变量的名称中使用问号.

版本较长:

举个例子,attr_accessor :foo就是这个只是 从概念上讲,以下是一些语法糖:

def foo
  @foo
end

def foo=(newfoo)
  @foo = newfoo
end
Run Code Online (Sandbox Code Playgroud)

此外,问号后缀大多只是一个约定,表示方法的返回值是布尔值.

我能在这里得到的最佳近似值...

class MyClass

  def initialize
    @awesome = true
  end

  def awesome?
    @awesome
  end

end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可能存在使用的情况attr_accessor- 毕竟,您可能明确表示您正在使用布尔属性.通常,我在实现一个方法时保存问号后缀,该方法的布尔返回值基于稍微复杂的条件而不仅仅是属性的值.

干杯!


两年后编辑,在最近的评论之后:

  1. Ruby强制执行某些命名约定. Ruby中的符号不​​能有问号.因此,:my_boolean_attribute?两者的调用都将失败NameError. 编辑:不正确,只需使用符号的引用语法,例如, :"my_attribute?"
  2. 符号是不可变的,尝试分配给一个将抛出一个SyntaxError.

  • Rubyist通常不在变量名和方法名中使用is_前缀.真棒?而不是is_awesome? (6认同)
  • 你可以做`:"my_boolean_attribute?"`,甚至`:"我的布尔属性?"`(祝你好运不过`发送`来调用后者!) (2认同)

Jul*_*lik 40

快速添加"问题方法"的最简单方法是为读者方法使用别名

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end 
Run Code Online (Sandbox Code Playgroud)

  • 设置保持"死=" (3认同)

Pla*_*ure 6

attr_accessor标志意味着变量名@my_boolean_attribute,所以这是你应该设置什么(而不是符号).

另外,你不能使用?对于变量,只是方法名称.


sep*_*p2k 5

?是方法名称的约定,而不是变量.您不能使用名为的实例变量@foo?,但是如果您愿意,可以使用名为的变量@foo并命名(手动创建的)getter方法foo?.