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