首页 文章

带有类型参数异常的宏

提问于
浏览
1

我可以在方法中使用类型化参数:

def my_method(val1, val2 : String? = nil)
  # something
end

但我不能在 macrocrystal 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

谢谢!

1 回答

  • 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上的问题跟踪器上打开一个问题,我认为还没有 .

相关问题