所以我从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
我很确定这是一项简单的任务,但不知怎的,我只是遇到了问题。
提前谢谢!
答案 0 :(得分:4)
在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了解更多信息。