我有一个关于super
我想要确认的问题。请考虑以下代码示例:
class InFasionHello
def hello person
greet person.name
end
def greet name
p 'Dude, hey ' + name
end
end
class OldFasionedHello < InFasionHello
def hello person
greet person.name if person.old_fashioned
super(person) if !person.old_fashioned
end
def greet name
p 'Good Day to you ' + name + '!'
end
end
我的问题是,如果我使用的是OldFasionedHello
,那么infasionHello
会使用本地greet
自己还是来自通过super
调用它的类?
答案 0 :(得分:4)
布丁的证据就在吃。
class Parent
def foo; p self; bar; end # This calls bar on the current object
def bar; puts "parent bar"; end
end
class Child < Parent
def foo; super; end # Removing this line changes nothing
def bar; puts "child bar"; end
end
Child.new.foo
#=> #<Child:0x007f980b051f40>
#=> child bar # NOTE! Not "parent bar"
如上所示,呼叫super
并不会改变自我。因此,您调用self(显式或隐式,不提供接收者)的方法仍然对原始实例起作用,并将其用于method lookup。
调用super()
等同于调用:
self.class.superclass.instance_method(__method__).bind(self).call
...这有助于说明您正在调用方法的实现,就像它在当前实例上一样。另请注意,super
与super()
不同,因为前者会神奇地传递提供给当前方法的任何参数。
答案 1 :(得分:1)
给定方法内的所有方法调用都是针对self
执行的。实例方法中的self
是一个实例本身,并且它是一个实例,它是此方法的接收者。因此,它启动了给定对象的标准方法查找,因此它将始终执行具有给定名称的最顶层方法。
一个极好的例子是class
方法:
class A
def foo
self.class
end
end
class B < A
end
B.new.foo #=> B even though foo comes from A