“新”我班级的班级名称

时间:2012-01-04 00:37:39

标签: ruby

在Ruby中,有没有办法获取创建MyClass实例的类的名称?

我知道我可以将它作为参数传递给我的初始化方法,但是我想知道是否有任何数据已经存在与在MyClass一侧创建MyClass实例的类有关。

所以它会像

class MyClass
  def initialize
    @who_called_me = who_called_me.name
  end

  def who_called_me
    puts @who_called_me
  end
end 

2 个答案:

答案 0 :(得分:5)

虽然这在实现和版本之间不可移植,但这是一个粗略的解决方案:

who_made_me=caller[3].split(':')[1][4..-2]

它的作用是获取当前堆栈,跳过initializeallocatenew的字符串,然后从字符串中获取方法名称。同样,这是完全黑客攻击,并且基于未指定的行为。我建议不要使用此项,除非绝对必要。

答案 1 :(得分:1)

一般来说,这是邪恶的。我在C#中看到了相同的东西,但它产生了暴力的残酷副作用,更不用说丑陋的代码了。

在Ruby中,如果你真的必须这样做,你可能会从Kernel.caller开始。但请不要这样做。