查找是在外部还是在内部调用类方法

时间:2011-04-29 18:57:27

标签: ruby

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 个答案:

答案 0 :(得分:2)

简单的答案是否定的。但是你可以使用caller,它可以让你访问调用堆栈,就像异常回溯一样:

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

caller[1]将是之前的调用,即调用this_method...

的方法

这是非常hackish,你从caller获得的信息可能还不够。

除了试验外,请不要使用它。

答案 1 :(得分:2)

如果您可以对代码进行一些修改:

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