Crystal lang:宏中的`block_given`?

我想要一种方法来检测是否给宏一个块,其行为取决于此 .

对于方法,我可以定义两个方法来处理不同的情况,一个是明确的块参数而另一个不是 . 编译器将按预期调用正确的方法 .

但是对于宏,我发现编译器并不关心块参数的多态性 - 它总是在给出块时调用第一个宏 .

回答(1)

2 years ago

我不确定我是否理解正确,但也许简单的检查帮助你?

macro name(*args, &block)
  {% if block %}
    puts "with block"
  {% else %}
    puts "without block"
  {% end %}
end

name do
  "1"
end
#=> with block

name("1")
#=> without block

https://carc.in/#/r/53yy