怀疑ruby中Method类的方法

时间:2014-05-21 09:21:59

标签: ruby-on-rails ruby

我看过http://www.ruby-doc.org/core-2.1.1/Method.html。 我对Method类的方法有疑问:

  1. nameoriginal_name之间的区别是什么?
  2. source_loction会为{3}}提供与红宝石相关的nil个对象吗?
  3. 我看到Method会给方法对象的绑定接收者。 bound receiver是什么意思?
  4. 无论如何要区分receiverdef <method_name> ..... end创建的方法吗?

1 个答案:

答案 0 :(得分:0)

  1. nameoriginal_name有什么区别?

    original_name会返回aliased methods的原始名称:

    def foo; end
    alias bar foo
    
    method(:bar).name          #=> :bar
    method(:bar).original_name #=> :foo
    
  2. source_loctionnil给予红宝石与宝石有关的Method个对象吗?

    source_location也适用于宝石:

    require 'rails'
    Rails.method(:version).source_location
    #=> [".../ruby/2.1.1/gems/railties-4.1.0/lib/rails/version.rb", 5]
    

    它为本机方法返回nil,即用C:

    编写的方法
    method(:puts).source_location #=> nil
    
  3. 我已经看到接收器会给方法对象的绑定接收器。绑定接收器的含义是什么?

    绑定方法与特定对象(接收方)相关联,可以调用,例如:

    str = "abc"
    str.method(:upcase) #=> #<Method: String#upcase>
    

    instance_method将该方法作为未绑定方法返回:

    String.instance_method(:upcase) #=> #<UnboundMethod: String#upcase>
    

    UnboundMethod没有接收器,也无法调用(没有可以提升的字符串实例)。

  4. 无论如何要区分def <method_name> ..... enddefine_method(symbol){block}创建的方法吗?

    我不这么认为。