ruby类attraccessor中的ruby符号



示例

 class Persion
    attr_accessor :name, :age
 end

我可以用这种格式写吗?

 class Persion
    attr_accessor name, age
 end

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

当然可以。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">

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

你可以在这里找到attr_accessor的源代码。

最新更新