Имеет ли Ruby 1.8 эквивалент 1.9 в __callee__? - PullRequest
2 голосов
/ 22 февраля 2011

Мне нужно взять название лексически заключенного в Ruby 1.8 метода;например,

def foo
  this_method = __callee__  # => 'foo'
end

Приведенный выше код действителен в Ruby 1.9, но не работает в 1.8, так как __callee__ был введен в 1.9.

Есть предложения для этого в 1.8? Kernel # caller выглядело многообещающе, но, похоже, дает мне стек вызовов, начиная с вызывающего метода, а не самого метода.

Я думаю, я мог бы выбросить исключение, поймать его,и захватить первый элемент в массиве Exception # backtrace , но моя интуиция говорит мне, что это будет медленно.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

На Ruby 1.8.7 есть __method__, не уверен насчет 1.8.6.

Во всяком случае, вы можете обезопасить модуль Kernel:

module Kernel
  # Defined in ruby 1.9
  unless defined?(__callee__)
    def __callee__
      caller[0] =~ /`([^']*)'/ and $1
    end
  end
end
2 голосов
/ 23 февраля 2011

Вы проверили, есть ли у драгоценного камня "backports"?

...