Crystal lang : 宏中的 `block_given`?
Crystal lang : `block_given` in Macro?
我想要一种方法来检测是否为宏提供了一个块,宏的行为取决于此。
对于方法,我可以定义两种方法来处理不同的情况,一种显式带有 block 参数,另一种则没有。编译器将按预期调用正确的方法。
但对于宏,我发现编译器并不关心块参数的多态性——只要给出块,它总是调用第一个宏。
我不确定我是否理解正确,但也许简单的检查对您有帮助?
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
我想要一种方法来检测是否为宏提供了一个块,宏的行为取决于此。
对于方法,我可以定义两种方法来处理不同的情况,一种显式带有 block 参数,另一种则没有。编译器将按预期调用正确的方法。
但对于宏,我发现编译器并不关心块参数的多态性——只要给出块,它总是调用第一个宏。
我不确定我是否理解正确,但也许简单的检查对您有帮助?
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