示例
class Persion
attr_accessor :name, :age
end
我可以用这种格式写吗?
class Persion
attr_accessor name, age
end
否,因为第一个示例中的方法是符号,而在第二个示例中,它将尝试调用不存在的name
和age
方法,这将导致异常。
当然可以。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
的源代码。