我是一名正在学习Ruby教程的新手,并且对下面send
方法的使用感到困惑。我可以看到send方法正在读取属性迭代器的值,但Ruby文档声明send方法采用前面带有冒号的方法。所以,我的困惑在于如何下面的send方法是内插迭代的属性变量。
module FormatAttributes
def formats(*attributes)
@format_attribute = attributes
end
def format_attributes
@format_attributes
end
end
module Formatter
def display
self.class.format_attributes.each do |attribute|
puts "[#{attribute.to_s.upcase}] #{send(attribute)}"
end
end
end
class Resume
extend FormatAttributes
include Formatter
attr_accessor :name, :phone_number, :email, :experience
formats :name, :phone_number, :email, :experience
end
答案 0 :(得分:2)
它不是“调用迭代器的值”,而是调用具有该名称的方法。在这种情况下,由于attr_accessor
声明,这些方法映射到属性。
一般而言,调用object.send('method_name')
或object.send(:method_name)
相当于object.method_name
。同样,send(:foo)
和foo
会在上下文中调用方法foo
。
由于module
声明了一个稍后与include
混合的方法,因此在模块中调用send
会调用Resume类的实例上的方法。
答案 1 :(得分:0)
这是您的代码的简化版本,为您提供正在发生的事情:
def show
p "hi"
end
x = "show"
y = :show
"#{send(y)}" #=> "hi"
"#{send(x)}" #=> "hi"