Ruby - 使用 splat 扩展方法
Ruby - extending method with super using splat
在 "Comprehensive Ruby programming course" 电子书中我有一个案例,子 class 方法扩展了父方法。我不完全知道它是如何工作的:
class Parent
def initialize(foo:, bar:)
@foo = foo
@bar = bar
end
end
class Child < Parent
def initialize(buzz:,**args)
super(**args)
@buzz = buzz
end
end
我不能完全理解为什么我们在这里使用 splat - **args
。
在这里 def initialize(buzz:,**args)
我们只是告诉 initialize
接受未知数量的键值参数,对吧?但这到底意味着什么 super(**args)
。告诉方法从 superclass 方法中获取那些键值参数?为什么不这样:
class Child < Parent
def initialize(buzz:)
super
@buzz = buzz
end
end
毕竟,super
告诉我们用父级中的任何内容扩展方法,那么为什么需要这些 splat args?
参数列表中的 **args
简单表示 "get all extra keyword arguments and put them in a hash, called args
".
相反,**args
在调用方法时执行相反的操作 - "get this hash called args
and pass keyword arguments with the corresponding names and values from that hash".
不带参数的 super
将尝试传递 child 方法收到的所有参数。因此,如果您有 parent 没有预料到的额外信息,您将得到 ArgumentError
.
在您的示例中,parent 只需要 foo:
和 bar:
,而 child 也有 buzz:
。
在 "Comprehensive Ruby programming course" 电子书中我有一个案例,子 class 方法扩展了父方法。我不完全知道它是如何工作的:
class Parent
def initialize(foo:, bar:)
@foo = foo
@bar = bar
end
end
class Child < Parent
def initialize(buzz:,**args)
super(**args)
@buzz = buzz
end
end
我不能完全理解为什么我们在这里使用 splat - **args
。
在这里 def initialize(buzz:,**args)
我们只是告诉 initialize
接受未知数量的键值参数,对吧?但这到底意味着什么 super(**args)
。告诉方法从 superclass 方法中获取那些键值参数?为什么不这样:
class Child < Parent
def initialize(buzz:)
super
@buzz = buzz
end
end
毕竟,super
告诉我们用父级中的任何内容扩展方法,那么为什么需要这些 splat args?
**args
简单表示 "get all extra keyword arguments and put them in a hash, called args
".
相反,**args
在调用方法时执行相反的操作 - "get this hash called args
and pass keyword arguments with the corresponding names and values from that hash".
不带参数的
super
将尝试传递 child 方法收到的所有参数。因此,如果您有 parent 没有预料到的额外信息,您将得到 ArgumentError
.
在您的示例中,parent 只需要 foo:
和 bar:
,而 child 也有 buzz:
。