不带参数调用超级

斯特凡

根据模块和类文档,调用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" }
奥雅纳(Arup Rakshit)

让我们以Ruby核心为例:

Keyword2

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C函数(不带参数)带参数调用

来自分类Dev

C函数(不带参数)带参数调用

来自分类Dev

Haxe生成带有参数的超级调用

来自分类Dev

从超级调用推断类参数类型

来自分类Dev

Haxe生成带有参数的超级调用

来自分类Dev

链接不带句点的方法调用时“不带参数”

来自分类Dev

不带所有参数调用matlab函数

来自分类Dev

VIM:替换不带参数的函数调用

来自分类Dev

如何调用不带实例参数的函数?

来自分类Dev

如何调用不带参数的方法?

来自分类Dev

通过不带参数的Jquery调用PHP

来自分类Dev

调用一个不带参数的函数

来自分类Dev

在CoffeeScript中调用不带参数的函数

来自分类Dev

错误:类型调用不带参数

来自分类Dev

如何修复“传递给不带参数的调用的参数”错误?

来自分类Dev

Swift 2.0-“传递给不带参数的调用的参数”

来自分类Dev

Swift 5-传递给不带参数的调用的参数

来自分类Dev

Swift 2-传递给不带参数的调用的参数

来自分类Dev

传递给不带参数的调用的参数-AppDelegate中的错误

来自分类Dev

调用接受`<?来自scala代码的超级T>`类型参数?

来自分类Dev

为什么不带参数调用basic_string :: substr?

来自分类Dev

如何使用delphi调用不带参数的oracle函数?

来自分类Dev

仅按名称调用C函数,不带参数

来自分类Dev

不带评估的函数调用的打印参数,不使用“宏”

来自分类Dev

当“错误:单元不带参数”时如何调用此Scala函数

来自分类Dev

仅按名称调用C函数,不带参数

来自分类Dev

如何使用获取AssertionError的线程调用不带参数的方法

来自分类Dev

破折号:如何捕获陷阱的输出(不带参数调用)?

来自分类Dev

不带可选参数的二义性方法调用

Related 相关文章

热门标签

归档