以下打印Bar
两次:
class Foo
def foo
p self.class # => prints Bar
end
end
class Bar < Foo
def foo
p self.class # => prints Bar
super
end
end
b = Bar.new
b.foo
如何打印
Bar
Foo
?即我想知道每种方法的定义是什么类。
答案 0 :(得分:3)
要捕获最初定义方法的上下文,可以使用define_method
而不是def
来获取适当的闭包。一个简单的例子:
class Foo
klass = self
define_method(:foo){p klass}
end
class Bar < Foo
def foo
p self.class
super
end
end
b = Bar.new
b.foo
答案 1 :(得分:0)
您可以像这样更改Foo#foo
(假设只有一个子类级别):
class Foo
def foo
if self.class == Foo
p self.class
else
p self.class.superclass
end
end
end
class Bar < Foo
def foo
p self.class
super
end
end
Foo.new.foo
Foo
Bar.new.foo
Bar
Foo
答案 2 :(得分:-1)
您可以使用
b.class.superclass <= "Foo"
你遇到的问题是,自我就是Bar的实例,b。
b.class <= always going to be Bar
self.class <= always going to be Bar if you are invoking Bar.
您说您在运行时定义了一个方法,并且您不知道类名。我真的不知道你的意思......我处理这个的方式就像
class Bar
def initialize
puts 'In BAR class'
end
def foo
p self.class.name # => prints Bar
end
end
然后
Bar.class_eval do
def brand_new_method
# do something new
p "Still in Bar, but this is dynamically added"
end
end
也许你正在谈论动态地将方法添加到继承链中更高的类...在你的例子中为“Foo”...基于“Bar”实例中的某些条件发生。如果是这种情况,那么为什么不使用单个模块来定义继承的方法:
module Foo
def foo
p self.class
end
end
然后以与class_eval相同的方式使用module_eval?