__callee__和__method__之间的区别

时间:2016-02-14 11:22:08

标签: ruby metaprogramming

在Ruby中,可以使用

__callee__ 

__method__ 

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

两者有什么区别?

3 个答案:

答案 0 :(得分:17)

__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]

答案 1 :(得分:7)

要解释documentation#app/views/admin/users/index.html.erb <% @users.each do |user| %> <tr> <td><%= user.first_name %></td> <td><%= user.last_name %></td> <td><%= user.admin %></td> <td><%= link_to "Admin?", user_admin_path(user), method: :post if can? :manage, user %></td> <td><%= link_to 'Edit', edit_user_path(user) %></td> </tr> <% end %> #app/controllers/users_controller.rb class UsersController < ApplicationController def admin @user = User.find params[:user_id] @user.toggle :admin if can? :manage, @user redirect_to @user end end 是调用者调用的方法的名称,而__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,因此bar会返回该值。

答案 2 :(得分:7)

__ method __ 返回已定义的名称, __ callee __ 返回名为name的名称。 它们通常是相同的,但在别名方法上有所不同。

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

link