Ruby中Super向上追溯方法路径
Varsion

在方法定义主体中,Super关键字可以在当前执行的方法查找路径的方法中,跳转到下一个高级定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module M
def Report
puts "this is in module M"
end
end

class C
include M
def Report
puts "this is in class C"
super
puts "back from the super call"
end
end

c = C.new
c.report

该份代码的输出结果是:

1
2
3
this is in class C
this is in module M
back from the super call

一个C的实例接收到了report消息,方法查找过程将会从类C开始,非常肯定这里是有一个Report方法,并且被执行了。

在方法内部有一个super调用,这说明即使对象找到了一个方法去响应该消息,也必须去继续搜索和查找以进行下一次匹配。

如果类C中不存在该方法,那么模块M中的report方法将会首先被匹配到。如果某个合适版本的方法在查找路径的后期被覆盖,super关键字提供了一种调用这个方法的方式。

有时,在编写一个子类的时候,存在类中的一个方法的功能已经几乎满足了用户的期望。但也不完全是这样,使用super可以同时拥有钩子和包装原始方法机制。

同时super处理传递参数的方式如下:

  • 无参数列表调用super自动转发被调用的方法的实参
  • 空参数列表调用super()不传递参数到更高一级的调用中。即使当前方法接受了传参
  • 指定参数的调用super(a,b,c)精准转发这些参数

  • Post title:Ruby中Super向上追溯方法路径
  • Post author:Varsion
  • Create time:2020-09-03 15:52:16
  • Post link:https://blog.varsion.cn/post/b99e89a0.html
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments