Поиск метода класса вызывается извне или изнутри - PullRequest
5 голосов
/ 29 апреля 2011
class MyParent
  def self.foo
    if this_method_was_called_internally?
      puts "yay" 
    else
      puts "boo"
    end
  end
end

class MyLibrary < MyParent
  foo # yay
end

MyLibrary.foo # boo

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Если вы можете позволить себе небольшую модификацию вашего кода:

class MyParent
  def self.foo(scope)
    if scope == self
      puts "yay" 
    else
      puts "boo"
    end
  end
end

class MyLibrary < MyParent
  foo(self) # yay
end

MyLibrary.foo(self) # boo
2 голосов
/ 29 апреля 2011

Простой ответ - нет. Тем не менее, вы можете играть с caller, это дает вам доступ к стеку вызовов, очень похоже на обратную трассировку исключения:

def this_method_was_called_internally?
  caller[1].include?(...)
end

(caller[1] будет предыдущим вызовом, то есть вызов метода this_method...)

Это очень хакерски, и информации, которую вы получаете от caller, может быть недостаточно.

Пожалуйста, не используйте это, кроме как для экспериментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...