我可以在方法中使用类型化参数:
def my_method(val1, val2 : String? = nil)
# something
end
但我无法在macro
(crystal play example)
macro my_macro(val1, v22 : String?)
puts {{val1}}
puts {{v22}}
end
我有异常
Syntax error in eval:1: unexpected token: : (expected ',' or ')')
是否可以在macro
中使用预定义类型?
我需要类似的东西:
macro my_macro(val1, val2_key val2 : String? = nil)
# do
end
THX!
答案 0 :(得分:3)
首先,宏中使用的类型与普通代码中的类型不同,例如,当您执行some_macro "a string"
时,在编译时"a string"
的类型为StringLiteral
其次,目前不可能对宏的论点进行限制..
你唯一能做的就是删除类型限制,并在开头添加一个if语句来检查参数的类型,如:
macro foo(arg = nil)
{% unless arg.is_a? StringLiteral || arg.is_a? NilLiteral %}
{% raise "arg must be a string or nil !" %}
{% end %}
end
如果你想要这个功能,你可以在Github上的问题跟踪器上打开一个问题,我认为还没有。