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

my_boolean_attribute?

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

class MyClass
  attr_accessor :my_boolean_attribute?

  def initialize
    :my_boolean_attribute? = false
  end
end

显然 ruby​​ 讨厌“?”。这是约定吗?我究竟做错了什么?

有帮助吗?

解决方案

编辑:三年后;时代,他们正在改变……

朱利克的回答 是当今解决该问题的最简单且最好的方法:

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 — 毕竟,您可能很明确地直接使用布尔属性。一般来说,当我实现一个方法时,我会保存问号后缀,该方法的布尔返回值基于比属性值稍微复杂的条件。

干杯!


两年后,根据最近的评论进行编辑:

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

其他提示

要快速添加“问题的方法”的最简单方法是使用走样读者法

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end 

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

此外,您不能使用?为变量,只是方法名。

?是方法名,不变量约定。你不能用一个实例变量命名@foo?,但是你可以使用一个变量@foo命名,如果你想命名(手动创建)getter方法foo?

猴修补元编程 - 也许它可以变得更优雅,这仅仅是一个快速的草案,我没有做过元编程了一小会儿......

 # inject the convenience method into the definition of the Object class
 class Object
   def Object::bool_attr(attrname)
     class_eval { define_method(attrname.to_s,
          lambda { instance_variable_get('@' + attrname.to_s.chop) }) }
     class_eval { define_method(attrname.to_s.chop+"=",
          lambda { |x| instance_variable_set('@'+attrname.to_s.chop, x) }) }
   end
 end

 ### somewhere later

 class MyClass

   bool_attr :my_boolean_attribute?

   def initialize
     @my_boolean_attribute = true
   end
 end

 # yet even more later

 foo = MyClass.new
 bar = MyClass.new

 foo.my_boolean_attribute = 1
 puts foo.my_boolean_attribute?
 puts bar.my_boolean_attribute?

通过这种方法,你可以干,并获得不错的问号了。你也许需要选择一个更好的名字比 “的 bool_attr 的” 一样, “ bool_attr_accessor 的” 或类似的东西。

,我提出的定义是有点胡思乱想,在某种意义上说,问号是存在于原始符号。可能是一个清洁器的方法是避免在符号名称的问号,并且该方法的定义期间其追加 - 应不混淆

哦,几乎忘了,包括强制性链接:眼看元类清楚

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top