Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby “引用”的类的名称;新的;我的班级_Ruby - Fatal编程技术网

Ruby “引用”的类的名称;新的;我的班级

Ruby “引用”的类的名称;新的;我的班级,ruby,Ruby,在Ruby中,有没有办法获取创建MyClass实例的类的名称 我知道我可以将其作为initialize方法的参数传入,但我想知道是否已经存在与在MyClass一侧创建MyClass实例的类有关的数据 那就好像 class MyClass def initialize @who_called_me = who_called_me.name end def who_called_me puts @who_called_me end end 总的来说,这是邪恶的。

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

我知道我可以将其作为initialize方法的参数传入,但我想知道是否已经存在与在MyClass一侧创建MyClass实例的类有关的数据

那就好像

class MyClass
  def initialize
    @who_called_me = who_called_me.name
  end

  def who_called_me
    puts @who_called_me
  end
end 

总的来说,这是邪恶的。我在C#中见过类似的代码,但它产生了极其残酷的副作用,更不用说丑陋的代码了


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

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

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

它的作用是获取当前堆栈,跳过
初始化
分配
新建
的字符串,然后从字符串中获取方法名称。同样,这是一个完全的黑客行为,是基于未指定的行为。除非绝对必要,否则我不建议使用此选项。

如果您需要知道,您的设计可能有问题。一般来说,我想不出简单的方法。但是,您可以获取堆栈回溯的字符串,并在调用
new
之前为帧解析它。这可能会为您提供调用
new
的部分代码。但这会使代码依赖于堆栈回溯的格式。这不是一件好事。这是一个特例,但谢谢你对我的设计提出质疑,这真的很有帮助。我按照我上面的建议添加了一个答案。我还没有测试它,但我会的。不是所有的类都有名称,
c=Class.new;例如,放置c.name
。当然,这是一个病态的案例,但是……我发布了一些可能使用
Kernel\caller
bellow工作的东西。这是一个完整的破解,我同意你的观点,但这是一个答案。“极端残酷的副作用”-请告诉更多@Andrew,基本上,因为其他代码无法预测构造函数的行为,所以它有特殊情况,因此它打破了所有OOP规则;我在Perl中看到了一个更糟糕的例子,根据调用方的不同对参数进行了不同的解析!!!这是一些乱七八糟的代码,但别担心,这是值得的。有些人是在一个对Rorobots友好的comp中,比如说我需要保护我的类不被so@Loren,您无法可靠地防止创建您的任何其他类,因为在ruby中,他们可以通过重新打开该类来重写您的类中保护您的部分。@LorenCFortner:如果有帮助,您可以尝试将保护代码编写为从扩展调用的C函数。Ruby不能重写C函数。