답변:
내 첫 번째 대답보다 __method__를 사용할 수 있습니다.
class Foo
def test_method
__method__
end
end
예를 들어, 기호를 반환합니다 :test_method
. 메소드 이름을 문자열로 리턴하려면 __method__.to_s
대신 호출하십시오 .
참고 : Ruby 1.8.7이 필요합니다.
__method__.to_s
하고 메서드 이름이 될 것입니다.
에서 http://snippets.dzone.com/posts/show/2785 :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__callee__
이 작업을 수행하지?
당신이 실제로 원하는에 따라, 당신은 하나를 사용하고 있습니다 __method__
또는 __callee__
상징으로 현재 실행중인 메소드의 이름을 반환한다.
루비 1.9에서는 둘 다 동일하게 작동합니다 ( 문서 와 테스트가 관련된 한).
루비 2.1과 2.2 __callee__
에서는 정의 된 메소드의 별칭을 호출하면 다르게 동작합니다. 문서 두 사람이 다릅니다 :
__method__
: "현재 메소드의 정의에있는 이름"(즉, 정의 된 이름)__callee__
: "현재 메소드의 호출 된 이름"(즉, 호출 된 이름)테스트 스크립트 :
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 출력 :
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 출력 ( __callee__
별칭 이름을 __method__
반환 하지만 메서드가 정의 된 시점의 이름을 반환) :
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Ruby 1.9+의 경우 다음을 사용하는 것이 좋습니다. __callee__
__callee__
1.9 이전 버전과 다르게 동작하므로 __method__
일관된 동작을 유지하는 것이 가장 좋습니다 . 1.9 이후 __callee__
와 동일하게 동작합니다 __method__
.
def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
이상한 것이 보이지 않습니까?
뷰 파일에서 메소드 이름을 검색하는 것과 동일한 문제가 있습니다. 나는 해결책을 얻었다.
params[:action] # it will return method's name
컨트롤러 이름을 얻으려면
params[:controller] # it will return you controller's name
super
SimpleDelegator 객체 내에서 검사 를 호출 할 수 있다는 것입니다.def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end