ruby类attr_访问器中的ruby符号
范例 我能用这种格式写吗ruby类attr_访问器中的ruby符号,ruby,Ruby,范例 我能用这种格式写吗 class Persion attr_accessor :name, :age end 否,因为第一个示例中的是符号,而在第二个示例中,它将尝试调用不存在的name和age方法,这将导致异常。否,您不能这样做,因为在attr\u accessor的实现中,它对传递的参数应用rb\u to\u id函数,该参数需要一个符号并返回它的id 您可以找到attr\u accessor的源代码,当然可以Module#attr_accessor是一种方法,就像其他任何
class Persion
attr_accessor :name, :age
end
否,因为第一个示例中的是符号,而在第二个示例中,它将尝试调用不存在的
name
和age
方法,这将导致异常。否,您不能这样做,因为在attr\u accessor
的实现中,它对传递的参数应用rb\u to\u id
函数,该参数需要一个符号并返回它的id
您可以找到attr\u accessor的源代码,当然可以
Module#attr_accessor
是一种方法,就像其他任何方法一样,如何向其传递参数没有什么特别之处。您不必传入符号
文字,您可以传入任何计算结果为符号
的表达式:
class Persion
attr_accessor name, age
end
类person
阶级#
我已经试过了,有一个错误,未定义#(NoMethodError)的方法'name=',我想我现在知道了!让它变得棘手的是,你不能用attr\u
方法来做这件事,但你可以用alias
@saw做这件事。好的一点是,你必须记住,alias
是一个关键字,attr\u accessor
是一种方法。让它变得棘手的是,你不能用attr\u>方法来做这件事,但是你可以用alias
来实现这一点。alias
和attr\u accessor
之间的区别在于alias
是一个关键字(因此它可以专门评估事物),而attr\u accessor
只是一个普通的方法,必须遵守与其他方法相同的评估规则。
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">