代码之家  ›  专栏  ›  技术社区  ›  KMcA

Ruby的块变量插值发送方法

  •  5
  • KMcA  · 技术社区  · 11 年前

    我是一个新手,正在学习一些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
    
    2 回复  |  直到 11 年前
        1
  •  2
  •   tadman    11 年前

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

    使命感 object.send('method_name') object.send(:method_name) 相当于 object.method_name 一般而言。同样地 send(:foo) foo 将调用该方法 足球 关于上下文。

    module 声明一个稍后与 include 使命感 send 在模块中具有在Resume类的实例上调用方法的效果。

        2
  •  0
  •   Arup Rakshit    11 年前

    send Documentation

    这里是您的代码的简化版本,为您提供正在发生的事情:

    def show
     p "hi"
    end
    
    x = "show"
    y = :show
    
    "#{send(y)}"   #=> "hi"
    "#{send(x)}"   #=> "hi"