2012-03-18 43 views
0

我希望能夠從當前調用的方法中識別出方法的名稱。我曾嘗試以下:self.name返回錯誤? Ruby1.9

#!/usr/bin/env ruby 
class SomeClass 
    def initialize 
    puts self.name 
    end 
end 
p = SomeClass.new 

但收到以下錯誤:

./test.rb:4:in `initialize': undefined method `name' <SomeClass:0x007fe4d107ba30 (NoMethodError) 
    from ./test.rb:7:in `new' 
    from ./test.rb:7:in `<main>' 

我怎麼叫我從調用方法?

+0

就像頭一起,有類#名稱的方法,這是你想要的無關。 – 2012-03-18 22:32:48

+0

[在Ruby中獲取當前正在執行的方法的名稱]的可能重複(http://stackoverflow.com/questions/199527/get-the-name-of-the-currently-executing-method-in-ruby) – 2014-09-11 08:02:04

回答

4
class SomeClass 
    def initialize 
    puts __callee__ 
    end 
end 
p = SomeClass.new #=> initialize 

__method____callee__是同義詞

+0

以下是['__callee__' /'__method__']的文檔(http://ruby-doc.org/core-1.9.3/Kernel.html#method-i-__callee__)供參考。 (編輯:SO弄亂了URL,所以這裏很簡單:'http://ruby-doc.org/core-1.9.3/Kernel.html#method-i -__ callee__' – 2012-03-18 02:52:10

+0

你不應該打擾,有沒有這麼多讀取 – megas 2012-03-18 03:12:35

2

在Ruby方法都不是程序員可以對它們進行操作,如他們可以在字符串和數組做定期的對象。因此,儘管Method類有name()方法,當你調用name()方法就搜索SomeClass及其祖先它們[Object, Kernel, BasicObject]

您可以通過在SomeClass在任何方法定義檢查self看到這一點。它將自行返回SomeClass

因此,您會得到undefined method異常。您可以使用__method__獲取當前的方法名稱。

class SomeClass 
    def initialize 
    puts __method__ 
    end 
end 

__method__返回符號。您可以使用to_s方法來獲取方法的字符串表示形式。

+0

'Method.name'是一種方法?爲什麼從一個方法調用self.name不返回方法的名稱? – rudolph9 2012-03-18 02:56:50

+0

看到我的更新回答。 – 2012-03-18 03:04:41

+0

@KurtRudolph因爲'self'不是方法,它是類的實例。 – 2012-03-18 03:15:25