【问题标题】:Difference between __callee__ and __method____callee__ 和 __method__ 之间的区别
【发布时间】:2016-05-25 06:55:24
【问题描述】:

在 Ruby 中,可以使用任一

__callee__ 

__method__ 

查找当前正在执行的方法的名称。

两者有什么区别?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    __method__ 静态查找名称,它指的是最近的词法封闭方法定义的名称。 __callee__ 动态查找名称,它指的是调用该方法的名称。 两者都不需要最初发送的消息相对应:

    class << (foo = Object.new)
      def bar(*) return __method__, __callee__ end
      alias_method :baz, :bar
      alias_method :method_missing, :baz
    end
    
    foo.bar # => [:bar, :bar]
    foo.baz # => [:bar, :baz]
    foo.qux # => [:bar, :method_missing]
    

    【讨论】:

    【解决方案2】:

    __method__ 返回定义的名称,__callee__ 返回被调用的名称。 它们通常相同,但在别名方法上有所不同。

    def foo
    [__method__, __callee__]
    end
    alias bar foo
    p foo #=> [:foo, :foo]
    p bar #=> [:foo, :bar]
    

    link

    【讨论】:

      【解决方案3】:

      解释documentation__callee__ 是调用者调用的方法的名称,而__method__ 是定义方法的名称。下面的例子说明了区别:

      class Foo
      
        def foo
          puts __callee__
          puts __method__
        end
      
        alias_method :bar, :foo
      end
      

      如果我打电话给Foo.new.foo,那么输出是

      foo
      foo
      

      但是如果我调用Foo.new.bar 那么输出是

      bar
      foo
      

      __method__ 在这两种情况下都返回:foo,因为这是定义的方法的名称(即类具有def foo),但在第二个示例中,调用者正在调用的方法的名称是@987654332 @ 等__callee__ 返回。

      【讨论】:

      • 我不知道 alias_method,所以除非使用它,否则它们总是返回相同的值?
      • 我认为别名(通过 alias 或 alias_method)是唯一可以不同的时候。
      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      • 2012-08-12
      • 2011-02-18
      相关资源
      最近更新 更多