현재 실행중인 메소드의 이름을 가져옵니다.


198

$0 최상위 Ruby 프로그램의 변수이지만 현재 메소드에 대한 변수가 있습니까?


한 가지 용도는 superSimpleDelegator 객체 내에서 검사 를 호출 할 수 있다는 것입니다.def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris

답변:


334

내 첫 번째 대답보다 __method__를 사용할 수 있습니다.

class Foo
  def test_method
    __method__
  end
end

예를 들어, 기호를 반환합니다 :test_method. 메소드 이름을 문자열로 리턴하려면 __method__.to_s대신 호출하십시오 .

참고 : Ruby 1.8.7이 필요합니다.


11
':'은 기호 기호 일뿐입니다. :) 그냥 __method__.to_s하고 메서드 이름이 될 것입니다.
Lambart

레이크 작업을하고 있다면 어떻게해야합니까?
Imran Ahmad

24

에서 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

5
이것은 (현재와 반대 되는) 호출 방법의 이름을 찾는 데 매우 도움이되었습니다 .
Lambart

않습니다 __callee__이 작업을 수행하지?
Joshua Pinter

훌륭한 솔루션 마크 현재 최고의 솔루션입니다. 장하다
jonathanccalixto

18

당신이 실제로 원하는에 따라, 당신은 하나를 사용하고 있습니다 __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}}

10

Ruby 1.9+의 경우 다음을 사용하는 것이 좋습니다. __callee__


3
__callee__1.9 이전 버전과 다르게 동작하므로 __method__일관된 동작을 유지하는 것이 가장 좋습니다 . 1.9 이후 __callee__와 동일하게 동작합니다 __method__.
레이 McCulloch

@LeighMcCulloch 예제를 통해 차이점을 설명 할 수 있습니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@CiroSantilli 六四 事件 法轮功 纳米比亚 威 视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이상한 것이 보이지 않습니까?
jgburet

4
이제 실제로 @LeighMcCulloch __callee____method__다른 행동이있다. 참조 pastie.org/10380985 (루비 2.1.5)
goodniceweb

1
pastie.org가 다운되었습니다. 영원히 또는 지금?
Nakilon

-3

뷰 파일에서 메소드 이름을 검색하는 것과 동일한 문제가 있습니다. 나는 해결책을 얻었다.

params[:action] # it will return method's name

컨트롤러 이름을 얻으려면

params[:controller] # it will return you controller's name

4
나는 당신이 레일 컨트롤러 액션 & http 메소드에 관한 질문을 잘못 해석했다고 생각합니다 ...이 답변은 아마도 삭제되어야합니다.
팩터 미스틱

보기에서 현재 실행중인 (컨트롤러) 메소드의 이름을 가져 오는 데 유용합니다.
avjaarsveld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.