Ruby继承获取调用者类名

时间:2014-01-15 00:02:17

标签: ruby inheritance

我很迷茫。我知道如何使用调用者来获取调用者方法,但是你使用什么来获取调用者类?

例如:

class Testing
  def return_caller_class
    return caller_class
  end
end

class Parent

  attr_accessor :test_me

  def initialize      
    self.test_me =  Testing.new
  end

end

class Child < Parent
end

class GrandChild < Child
end

test_Parent = Parent.new
test_Child = Child.new
test_GrandChild = GrandChild.new

puts test_Parent.test_me.return_caller_class     => Parent
puts test_Child.test_me.return_caller_class      => Child
puts test_GrandChild.test_me.return_caller_class => GrandChild

谢谢!!!

编辑:

我试过以下

class Testing
  def return_caller_class
    return caller[0][/`.*'/][1..-2]
  end
end

输出是:

{"
"=>Parent}    
{"
"=>Child}
{"
"=>GrandChild}

更好地解释我的问题。

我会将输出显示为

Parent
Child
GrandChild

2 个答案:

答案 0 :(得分:2)

我对这个问题有点不了解,但我认为你犯了一些与获得来电者的班级名称无关的错误。如果我可以帮助你做这些事情,至少你可能会更近一步(如果解决方案甚至可能)!

首先,在我看来,你是从主程序对象调用return_caller_class,而不是从你创建的这三个对象中的一个调用。在类Testing的对象中有一个类Parent的对象,但方法调用在两者之外。

其次,你似乎得到任何接近你想要的东西的唯一原因(当你获得像"=>Parent}这样的输出时,与return_caller_class方法无关。好像你无意中创造了你的程序的最后三行(当你添加了=> Parent等)时出现了一些小的哈希值,这些哈希值是用puts输出的。(在此确认:Has #puts created a new hash?)如果这些是评论,他们需要#

PS。我在另一个帖子上找到了这个gem的链接:https://github.com/asher-/sender。可能值得一试。

答案 1 :(得分:0)

class Testing
  def return_caller_class
    self.class.name
  end
end

class ChildOne < Testing
end

class ChildTwo < Testing
end

result:
------------------------------------------------
>ChildOne.new.return_caller_class
 => "ChildOne"
>ChildTwo.new.return_caller_class
 => "ChildTwo"
>Testing.new.return_caller_class
 => "Testing"