【问题标题】:Call optional proc only if proc was set仅在设置了 proc 时才调用可选 proc
【发布时间】:2017-09-07 20:42:09
【问题描述】:

所以我从 ruby​​ 移植了一个工具,如果可以在对象上定义一个回调块,我希望在设置回调的情况下调用它。 所以基本上是这样的。

def set_block(&block)
  @new_kid_on_the_block = block
end

def call_the_block_if_it_was_defined
  block.call("step by step") if block = @new_kid_on_the_block
end

我很确定这是一项简单的任务,但不知何故我遇到了问题。

提前谢谢你!

【问题讨论】:

  • 那么问题是什么? block.call("step by step") if block = @new_kid_on_the_block 可能只是 @new_kid_on_the_block.call("step by step") if @new_kid_on_the_block
  • 您是在寻找水晶代码还是红宝石代码?
  • 啊,是的,我当然是指水晶!当然,绑定到局部变量是毫无用处的——我的错!

标签: ruby proc crystal-lang


【解决方案1】:

在 Crystal 中,您几乎总是必须明确指定实例变量的类型。下面是它的外观:

class A
  alias BlockType = String -> String

  def set_block(&block : BlockType)
    @block = block
  end

  def call_block
    @block.try &.call("step by step")
  end
end

a = A.new
pp a.call_block # => nil
a.set_block { |a| a + "!" }
pp a.call_block # => "step by step!"

查看Capturing blocks 了解更多信息。

【讨论】:

  • block : BlockType? 什么都不做,你忘了@ 吗? (或者干脆移除它)
  • 也可以使用def set_block(&@block : BlockType); end(参数中直接赋值@block
  • 好收获。删除了该行;)
  • @bew 我知道&@block 语法,但希望更接近问题中的 OP 代码。感谢您的评论!
猜你喜欢
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多