检查宏中的节点类型

#5028

我如何知道宏中的类型类?例如,这个:

class A
  Const = 42

  macro is_int(val)
    {% p "#{val} is int: #{val.is_a?(Int32)}" %}
  end

  is_int(Const)
end

打印 false .

回答(1)

2 years ago

@asterite说:

is_a?在宏中检查节点是否属于给定的AST节点类型 .

因此,您应该使用 val.resolve.is_a?(NumberLiteral) .

Bonus: 如果要检查节点是否是类的后代,可以使用 val.resolve < AncestorClass (例如 val.resolve < ::Enum 来检查 val 是否为 Enum ) .