如何检查一个常量是否在晶体中定义

问题描述:

我需要验证一个常量是否被定义为执行条件。如何检查一个常量是否在晶体中定义

我想这一点,但“规定”的方法不存在于这个语言:

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

您可以使用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ß所提到的那样,无论使用哪种语言,您在高级宏编程中都只需要这样的编程,在其他任何地方它都是一个巨大的代码异味。

+0

虽然应该指出,在高级宏编程中你只需要使用它,但无论使用何种语言,在任何其他地方都会产生巨大的代码异味。 –

+0

@JonneHaß谢谢。我为此添加了一条便条 –