Ruby super 关键字

由于之前没接触过 Ruby super 的用法,想当然地按照 Java 的方法来使用,闹出了一个匪夷所思的 Bug。

1
2
3
4
5
6
7
8
9
10
11
12
13
class A
def a_method(arg)
arg
end
end

class B < A
def a_method(arg)
super.a_method(arg)
end
end

B.new.a_method(1) # => NoMethodError: undefined method `a_method' for 1:Fixnum

查了下才知,原来在 Ruby 中调用父类的同名方法, 只需使用 super,而不需再加上方法的名字。
上述代码改成如下即可。

1
2
3
4
5
class B < A
def a_method(arg)
super(arg)
end
end

那想调用父类的其他方法要如何?可以使用 method(:foo).super_method.call 来调用父类的 foo 方法。

编程这事,果然不能想当然,不然坑得是自己。

参考