如何在Crystal中检查常量是否已定义

7

我需要验证一个常量是否已定义,以便进行条件判断。

我尝试过这个方法,但是这种语言中不存在“defined”方法:

if defined(constant)
  value = :foo
else
  value = :bar
end
1个回答

7

您可以使用TypeNode#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ß所提到的,你只需要在高级宏编程中使用此功能,在其他任何地方使用都会产生巨大的代码味道,无论使用哪种语言。


1
需要注意的是,你只有在高级宏编程中才需要这个,而在其他地方,无论使用什么语言,这都是一种糟糕的代码味道。 - Jonne Haß

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接