我正在#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
还是不相同?而且只是好奇 - 如果它不相同,是否有更简洁的方法来使用符号来处理原始代码?
答案 0 :(得分:2)
显然,这两个版本并不相同。第一个将调用一个名称基于变量k
的内容的方法。在第二个版本中,变量k
从未使用过,它只会一遍又一遍地调用方法k
。
IOW:第一个版本将在循环的每次迭代中调用不同的方法,第二个版本将在循环的每次迭代中调用相同的方法。 / p>
当然,您可以使用与此处使用字符串完全相同的符号:
def initialize(attributes = {})
attributes.each do |k,v|
self.send(:"#{k}=", value)
end
end
答案 1 :(得分:0)
send
可以同时包含symbol
和string
你可以将方法重写为
def initialize(attributes = {})
attributes.each do |k,v|
self.send("#{k}=".to_sym, value)
end
end