5

我是一个新手,正在学习一些 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
4

2 回答 2

2

它不是“调用迭代器的值”,而是调用具有该名称的方法。在这种情况下,由于attr_accessor声明,这些方法映射到属性。

通称object.send('method_name')object.send(:method_name)等同object.method_name于笼统的说法。同样,send(:foo)并且将在上下文中foo调用该方法。foo

由于module声明了一个稍后与 混合的方法,因此在模块中include调用send具有调用 Resume 类实例上的方法的效果。

于 2013-04-02T16:50:51.143 回答
0

send Documentation

这是您的代码的简化版本,可以告诉您发生了什么:

def show
 p "hi"
end

x = "show"
y = :show

"#{send(y)}"   #=> "hi"
"#{send(x)}"   #=> "hi"
于 2013-04-02T16:45:50.587 回答