Mark24
记录灵感、技术、思考
笔记:Ruby的super
super
Examples:
super
super(1,2,3)
Syntax:
super
super(expr,...)
the super invokes the method which the current method overrides. If no arguments given, arguments to the current method passed to the method.
感觉解释的不太清楚。
其实ruby里面的super行为特别简单。
# super调用意味着,调用 父类同名方法。明确参数即传递书写的参数
super( ... )
# 无参数,会把当前方法参数默认传递给 父类同名函数
super
实验
1.对比 initialize 方法
调用且传参数结果, 参数以字面量书写为准。
class A
def initialize(*args)
puts '---A initialize----'
puts args
end
end
class B < A
def initialize(*args)
puts '---B initialize---'
puts args
super(address: 'earth')
end
end
b = B.new( name: 'tom', age: '18')
#ouput>>>>>>>>>>
# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---A initialize----
# {:address=>"earth"}
2.调用且不传参数
不传参数则转发当前函数的参数。
class A
def initialize(*args)
puts '---A initialize----'
puts args
end
end
class B < A
def initialize(*args)
puts '---B initialize---'
puts args
super
end
end
b = B.new( name: 'tom', age: '18')
#output>>>>>>
# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---A initialize----
# {:name=>"tom", :age=>"18"}
3.其他方法表现也一样毫无差别
这里可能会比其他语言灵活。其他语言可能没有这样玩super的。 一般都限定在 init 周期。
class A
def initialize(*args)
puts '---A initialize----'
puts args
end
def run(*args)
puts '---A run----'
puts args
end
end
class B < A
def initialize(*args)
puts '---B initialize---'
puts args
end
def run(*args)
puts '---B run----'
puts args
super
end
end
b = B.new( name: 'tom', age: '18')
b.run(name: 'run', age: '18')
#output>>>>>
# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---B run----
# {:name=>"run", :age=>"18"}
# ---A run----
# {:name=>"run", :age=>"18"}
总结
super就像一个约定名字,可以自由调用父类同名方法,就是这样。
还提供一个便利——不加参数即自动转发当前函数参数。