在hash参数上迭代调用self.send以初始化()

fra*_*anz 18 ruby

我正在尝试理解以下Ruby代码.

它看起来像是attrs一个散列,它作为参数传递,默认值为空散列.

然后attrs.each迭代hash(|k,v|)中的键值对.

通过self.send在此迭代期间调用键值对的元素可以获得什么效果?

def initialize(attrs = {}, *args)
  super(*args)
  attrs.each do |k,v|
    self.send "#{k}=", v
  end
end
Run Code Online (Sandbox Code Playgroud)

Sar*_*Mei 26

send 在第一个参数中调用该方法,并将其余参数作为参数传递.

在这种情况下,我假设什么attrs是属性列表.让我们说它是这样的:

{ :name => "John Smith" }
Run Code Online (Sandbox Code Playgroud)

那么在循环中,它会这样做:

self.send "name=", "John Smith"
Run Code Online (Sandbox Code Playgroud)

这相当于

self.name = "John Smith"
Run Code Online (Sandbox Code Playgroud)

  • 首先,该示例根本不是创建一个方法 - 它调用方法`name =`,它必须已经存在.其次,实例方法中的self(例如initialize)指的是实例.所以这是调用实例方法. (3认同)