重新打开 class 或结构内部宏
Reopening class or struct inside macro
在 "normal" 代码中,可以使用 klass.is_a?(Reference.class)
检查 class 是否使用 class
或 struct
:
Array.is_a?(Reference.class) #=> true
Tuple.is_a?(Reference.class) #=> false
但是,我似乎无法弄清楚如何在宏中执行相同的操作以重新打开 class/struct。
例如:如果我将 Array
class 传递给我的宏,我需要生成以 class Array
开头的代码,而对于 Tuple
它需要是 struct Tuple
.
我一遍又一遍地阅读 docs for Crystal::Macros,但我无法想出满足我需要并编译的代码。
{% if Reference.all_subclasses.includes?(klass.resolve) %}
您可以使用 <
来检查:
class MyClass
end
struct MyStruct
end
p {{ MyClass < Reference }} # => true
p {{ MyClass < Struct }} # => false
p {{ MyStruct < Struct }} # => true
p {{ MyStruct < Reference }} # => false
但是,我建议要求用户在所述类型中使用宏。这样你就不需要重新打开 class/struct 因为你已经在里面了。
这是标准库和语言中实现了多少东西。例如:
class Foo
# it's not "include Foo, Bar" where "include" reopens the type
include Bar
# It's not "JSON.mapping Foo, ..." where JSON.mapping reopens the type
JSON.mapping(...)
end
在 "normal" 代码中,可以使用 klass.is_a?(Reference.class)
检查 class 是否使用 class
或 struct
:
Array.is_a?(Reference.class) #=> true
Tuple.is_a?(Reference.class) #=> false
但是,我似乎无法弄清楚如何在宏中执行相同的操作以重新打开 class/struct。
例如:如果我将 Array
class 传递给我的宏,我需要生成以 class Array
开头的代码,而对于 Tuple
它需要是 struct Tuple
.
我一遍又一遍地阅读 docs for Crystal::Macros,但我无法想出满足我需要并编译的代码。
{% if Reference.all_subclasses.includes?(klass.resolve) %}
您可以使用 <
来检查:
class MyClass
end
struct MyStruct
end
p {{ MyClass < Reference }} # => true
p {{ MyClass < Struct }} # => false
p {{ MyStruct < Struct }} # => true
p {{ MyStruct < Reference }} # => false
但是,我建议要求用户在所述类型中使用宏。这样你就不需要重新打开 class/struct 因为你已经在里面了。
这是标准库和语言中实现了多少东西。例如:
class Foo
# it's not "include Foo, Bar" where "include" reopens the type
include Bar
# It's not "JSON.mapping Foo, ..." where JSON.mapping reopens the type
JSON.mapping(...)
end