【问题标题】:How to prevent `super` from yielding如何防止“超级”屈服
【发布时间】:2018-06-04 07:11:26
【问题描述】:

我有一个 Duck 类,它的 initialize 方法会产生一个块:

class Duck
  def initialize()
    if block_given?
      yield(self)
    end
  end
end

还有一个类 TalkingDuck 在初始化时迎接程序员。

class TalkingDuck < Duck
  def initialize()
    super()
    puts 'I am a duck'
  end
end

当我用一个块调用构造函数TalkingDuck.new 时,我不希望这个块被执行。这个:

TalkingDuck.new { puts 'Quack' }

应该只打印I am a duck,而不是Quack。如何防止块被执行?

【问题讨论】:

  • 查看@Stefan 的精彩回答here

标签: ruby


【解决方案1】:

Ruby 将当前方法的参数和块隐式传递给super。使用参数,可以通过显式调用不带参数的super (super()) 来避免这种情况。块也可以做同样的事情。可以使用&amp; 将块传递给方法:

greet = proc { puts 'hi' }
do_some_stuff(&greet)

您可以明确避免使用&amp;nil 传递块。在这种情况下,这意味着您可以将TalkingDuckinitialize 方法更改为:

def initialize()
  super(&nil)
  puts 'I am a duck'
end

它会显式丢弃任何给定的块,并且不会将其进一步传递给super,但您仍然可以在方法中自己处理该块。

【讨论】:

  • 注意:我在thisstackoverflow 问题中找到了此信息,但由于该问题是what does X do?,因此寻找how do I do Y? 的人可能不会找到它。当然,替代/更好的答案仍然非常受欢迎:)
  • 如果您的方法接受任何参数,则传递 &amp;nil 以防止向上传递块会阻止默认的“在不带参数的情况下调用 super 时传递所有参数”,因此您需要枚举你想要传递的参数:super arg1, arg2,...,&amp;nil
  • “用 nil 调用 super”,即 super(nil) 将单个参数 nil 传递给 super。您必须调用 super() 才能不传递任何参数。这是相当不同的。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2019-11-21
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多