红宝石类attr_accessor中的ruby符号

时间:2014-04-24 07:58:25

标签: ruby

实施例

 class Persion
    attr_accessor :name, :age
 end

我可以用这种格式书写吗?

 class Persion
    attr_accessor name, age
 end

3 个答案:

答案 0 :(得分:1)

不,因为第一个示例中的符号是符号,而在第二个示例中,它将尝试调用不存在的nameage方法,这将导致异常。

答案 1 :(得分:1)

是的,当然可以。 Module#attr_accessor是一个方法,就像任何其他方法一样,没有什么特别的关于如何将参数传递给它。您没有 传入Symbol字面值,您可以传入任何评估为Symbol的表达式:

class Persion
  class << self
    private
    def name; :name end
    def age; :age end
  end

  attr_accessor name, age
end

Persion.new.tap do |p| p.name = 'Foo'; p.age = 42 end
# => #<Persion:0x007f7f70fc5160 @age=42, @name="Foo">

答案 2 :(得分:0)

不,你不能这样做,因为在attr_accessor的实现中,它对传递的参数应用rb_to_id函数,这些参数需要符号并返回它id

您可以找到attr_accessor here的源代码。