Ruby 的 attr_accessor 魔术方法定义

标签 ruby

为了更好地理解 Ruby,我决定重新创建 attr_accessor 方法。成功了。除了有关 Ruby 语法糖的一个细节外,我现在了解它是如何工作的。这是我创建的 attr_accessor 方法:

def attr_accessor(*attributes)
  attributes.each do |a|
    # Create a setter method (obj.name=)
    setter = Proc.new do |val|
      instance_variable_set("@#{a}", val)
    end

    # Create a getter method (obj.name)
    getter = Proc.new do
      instance_variable_get("@#{a}")
    end

    self.class.send(:define_method, "#{a}=", setter)
    self.class.send(:define_method, "#{a}", getter)
  end
end

在我看来,我只是定义了两个方法,obj.name 作为 getter 和 obj.name= 作为 setter。但是当我在 IRB 中执行代码并调用 obj.name = "A string" 它仍然有效,即使我定义的方法没有空格!

我知道这只是定义 Ruby 的魔法的一部分,但究竟是什么让它起作用?

最佳答案

当 ruby​​ 解释器看到 obj.name = "A string 时,它会忽略 name= 之间的空格并寻找一个obj 上名为 name= 的方法。

关于Ruby 的 attr_accessor 魔术方法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876635/

相关文章:

ruby - 如何强制 Ruby 的 CSV 输出中的一个字段用双引号引起来?

ruby - 如何全局使用单用户的 RVM 安装?

ruby-on-rails - rails ActiveRecord : Automatically Alias/Append Suffix?

ruby - 如何在 Ruby 中编写条件 lambda?

ruby-on-rails - ruby on Rails 中的 Cronjob

ruby-on-rails - 无法通过 Post 在 Rspec 中创建模型

python - 如何为我的 P2P 租赁市场建立数据库?

c# - Ruby 和 C# 中的方法串联

ruby-on-rails - 未定义方法 `errors' 为 nil :NilClass in app/views/articles/new. html.erb

ruby - Ruby 的 Net::HTTP 线程安全吗?