attr_accessor如何在Ruby on Rails中工作

One*_*ero 0 ruby ruby-on-rails

可能重复:
Ruby中的attr_accessor是什么?

这是示例代码:

class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name = attributes[:name]
    @email = attributes[:email] 
  end 

....

end
Run Code Online (Sandbox Code Playgroud)

当我做

example = User.new
Run Code Online (Sandbox Code Playgroud)

它创建一个空的用户,我可以分配其名称和电子邮件

example.name = "something"
example.email = "something" 
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么这件事有效?计算机如何知道example.name表示类中的@name变量?我假设名称和:名称不同,在代码中我们没有明确告诉计算机example.name等同于:name symbol.

Ser*_*sev 5

什么attr_accessor做的是它创造了两个方法,一个getter和一个setter.它使用您传递的符号来构造方法和实例变量的名称.看,这段代码:

class User
  attr_accessor :name
end
Run Code Online (Sandbox Code Playgroud)

相当于这段代码

class User
  def name
    @name
  end

  def name=(val)
    @name = val
  end
end
Run Code Online (Sandbox Code Playgroud)


Kor*_*tor 5

attr_accessor :field与呼叫attr_reader :field和相同attr_writer :field。依次大致等于:

def field
  @field
end

def field=(value)
  @field = value
end
Run Code Online (Sandbox Code Playgroud)

欢迎使用元编程的魔力。;)