根据模块和类的文档,调用super
(不带参数或括号)将使用相同的参数调用父方法:
当不带任何参数
super
使用时,将使用赋予子类方法的参数。
为“参数变量”分配一个新值似乎可以改变这种行为:
class MyClass
def foo(arg)
puts "MyClass#foo(#{arg.inspect})"
end
end
class MySubclass < MyClass
def foo(arg)
puts "MySubclass#foo(#{arg.inspect})"
super
arg = 'new value'
super
end
end
MySubclass.new.foo('inital value')
输出:
MySubclass#foo("inital value")
MyClass#foo("inital value")
MyClass#foo("new value") # <- not the argument given to MySubclass#foo
这是预期的吗?
这似乎是位置和关键字参数的预期行为,但不适用于块参数:
class MyClass
def foo(&block)
puts "MyClass#foo { #{block.call.inspect} }"
end
end
class MySubclass < MyClass
def foo(&block)
puts "MySubclass#foo { #{block.call.inspect} }"
super
block = Proc.new { 'new value' }
super
end
end
MySubclass.new.foo { 'initial value' }
输出:
MySubclass#foo { "initial value" }
MyClass#foo { "initial value" }
MyClass#foo { "initial value" }
让我们以Ruby核心为例:
class Base
def single(a) a end
def double(a, b) [a,b] end
def array(*a) a end
def optional(a = 0) a end
def keyword(**a) a end
end
class Keyword2 < Base
def keyword(foo: "keyword2")
foo = "changed1"
x = super
foo = "changed2"
y = super
[x, y]
end
end
现在,查看测试用例:
def test_keyword2
assert_equal([{foo: "changed1"}, {foo: "changed2"}], Keyword2.new.keyword)
end
上面的例子精确地计算了关键字文档。
在没有参数且没有空参数列表的情况下调用,super会使用与用于调用当前方法的参数相同的参数和代码块来调用适当的方法。用一个或多个参数列表调用,它将使用完全指定的参数来调用适当的方法(在空括号表示空参数列表的情况下,不包括任何参数)。
相同的参数表示正在说参数变量的当前值。test_super.rb
文件包含我们可以super
在Ruby中处理的所有各种各样的东西。
不,它也可以与block一起使用(取自core):
a = Class.new do
def foo
yield
end
end
b = Class.new(a) do
def foo
super{
"b"
}
end
end
b.new.foo{"c"} # => "b"
但是,不知道为什么下面给出了"c"
吗?这实际上是OP的更新问题:
c = Class.new do
def foo(&block)
block.call
end
end
d = Class.new(c) do
def foo(&block)
block = -> { "b" }
super
end
end
d.new.foo{"c"} # => "c"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句