如何检查Crystal

时间:2017-08-27 18:04:24

标签: metaprogramming crystal-lang

我需要验证是否定义了常量来执行条件化。

我正在尝试这个,但这种语言不存在“已定义”方法:

if defined(constant)
  value = :foo
else
  value = :bar
end

1 个答案:

答案 0 :(得分:6)

您可以使用macroTypeNode#has_constant?

FOO = 1

value = nil
{% if @type.has_constant? "FOO" %}
  value = :foo
{% else %}
  value = :bar
{% end %}

pp value #=> :foo

或者甚至更好,您可以为此编写一个简短的自定义宏:

macro toplevel_constant_defined?(c)
  {{ @type.has_constant? c }}
end

pp toplevel_constant_defined? "FOO" # => true
pp toplevel_constant_defined? "BAR" # => false

注意:正如Jonne Haß所述,您只需要在高级宏编程中使用它,无论使用哪种语言,它都会在其他任何地方出现巨大的代码味道。< / p>