self.name возвращает ошибку?ruby1.9 - PullRequest
0 голосов
/ 18 марта 2012

Я хотел бы иметь возможность определить, как называется метод из метода, который вызывается в данный момент.Я пробовал следующее:

#!/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>'

Как мне вызвать метод, из которого я вызываю?

Ответы [ 2 ]

4 голосов
/ 18 марта 2012
class SomeClass
  def initialize
    puts __callee__
  end
end
p = SomeClass.new #=> initialize

__method__ и __callee__ являются синонимами

2 голосов
/ 18 марта 2012

В Ruby методы не являются обычными объектами, которые программист может использовать для них, как для Strings и Arrays. Таким образом, хотя класс Method имеет метод name(), при вызове метода name() он ищется в SomeClass, а его предки - [Object, Kernel, BasicObject]

Это можно увидеть, проверив self в любом определении метода в SomeClass. Он вернет SomeClass как себя.

Следовательно, вы получаете undefined method исключение. Вы можете использовать __method__, чтобы получить имя текущего метода.

class SomeClass
  def initialize
    puts __method__
  end
end

__method__ возвращает символ. Вы можете использовать метод to_s, чтобы получить строковое представление метода.

...