Ruby Send Method,迭代为符号而不是字符串

时间:2014-08-13 20:03:07

标签: ruby

我正在#send上阅读ruby-docs并看到它花了:符号。

这是否意味着此代码(假设为属性键设置了attr_accessors):

def initialize(attributes = {})
  attributes.each do |k,v|
    self.send("#{k}=", value)
  end
end

可以重写为:

def initialize(attributes = {})
  attributes.each do |k,v|
    self.send(:k, value)
  end
end

还是不相同?而且只是好奇 - 如果它不相同,是否有更简洁的方法来使用符号来处理原始代码?

2 个答案:

答案 0 :(得分:2)

显然,这两个版本并不相同。第一个将调用一个名称基于变量k的内容的方法。在第二个版本中,变量k从未使用过,它只会一遍又一遍地调用方法k

IOW:第一个版本将在循环的每次迭代中调用不同的方法,第二个版本将在循环的每次迭代中调用相同的方法。 / p>

当然,您可以使用与此处使用字符串完全相同的符号:

def initialize(attributes = {})
  attributes.each do |k,v|
    self.send(:"#{k}=", value)
  end
end

答案 1 :(得分:0)

send可以同时包含symbolstring

你可以将方法重写为

def initialize(attributes = {})
  attributes.each do |k,v|
    self.send("#{k}=".to_sym, value)
  end
end