如何查看 constant/TypeNode 是否已在编译时宏中定义?
How to see if a constant/TypeNode has been defined during a compile time macro?
是否可以检查是否使用宏定义了全局常量(例如 Class 的 TypeNode、Struct、Module)?
{% if defined?(::My_Class) %}
puts "My_Class has been defined."
{% end %}
我知道可以使用 TypeNode#has_constant?
,但问题是是否已在全局命名空间中定义常量。
(我问的原因是因为在开发和重构期间,我发现在我可以重写代码库的其余部分之前,这在某些情况下是一个方便的占位符。)
您可以编写一个宏来模拟该功能。
使用TypeNode#resolve?检查常量是否已经定义然后有条件的插入你要执行的代码:
macro if_defined(path, &blok)
{% if path.resolve? %}
{{blok.body}}
{% else %}
puts "Not defined: {{path.id}} "
{% end %}
end # === macro if_defined
if_defined(Kemal::Session::My_Constant) do
Kemal.listen
end
在顶层作用域中,宏变量@type
引用程序。您可以使用 @type.has_constant?(:Foo)
来确定是否定义了顶级常量 Foo
。
是否可以检查是否使用宏定义了全局常量(例如 Class 的 TypeNode、Struct、Module)?
{% if defined?(::My_Class) %}
puts "My_Class has been defined."
{% end %}
我知道可以使用 TypeNode#has_constant?
,但问题是是否已在全局命名空间中定义常量。
(我问的原因是因为在开发和重构期间,我发现在我可以重写代码库的其余部分之前,这在某些情况下是一个方便的占位符。)
您可以编写一个宏来模拟该功能。 使用TypeNode#resolve?检查常量是否已经定义然后有条件的插入你要执行的代码:
macro if_defined(path, &blok)
{% if path.resolve? %}
{{blok.body}}
{% else %}
puts "Not defined: {{path.id}} "
{% end %}
end # === macro if_defined
if_defined(Kemal::Session::My_Constant) do
Kemal.listen
end
在顶层作用域中,宏变量@type
引用程序。您可以使用 @type.has_constant?(:Foo)
来确定是否定义了顶级常量 Foo
。