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">