在Ruby中,可以使用
__callee__
或
__method__
找到当前正在执行的方法的名称。
两者有什么区别?
答案 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]