2

「通常の」コードでは、クラスがorklass.is_a?(Reference.class)で実装されているかどうかを確認するために使用できます。classstruct

Array.is_a?(Reference.class) #=> true
Tuple.is_a?(Reference.class) #=> false

ただし、マクロで同じことを行って、上記のクラス/構造体を再度開く方法がわかりません。

例: クラスをマクロに渡す場合Array、 で始まるコードを生成する必要がありますclass Arrayが、 a のTuple場合はstruct Tuple.

Crystal::Macrosのドキュメントを何度も読みましたが、必要なことを実行してコンパイルできるコードを思いつくことができません。

4

2 に答える 2

2

これを確認するために使用できます<

class MyClass
end

struct MyStruct
end

p {{ MyClass < Reference }}  # => true
p {{ MyClass < Struct }}     # => false
p {{ MyStruct < Struct }}    # => true
p {{ MyStruct < Reference }} # => false

ただし、このタイプ内でマクロを使用するようにユーザーに要求することをお勧めします。この方法では、すでにクラス/構造体の中にいるため、クラス/構造体を再度開く必要はありません。

これは、標準ライブラリと言語で実装されているものの数です。例えば:

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
于 2016-10-29T12:23:21.480 に答える
1

Gitterのcjgajardは、次の解決策を指摘しました。

{% if Reference.all_subclasses.includes?(klass.resolve) %}
于 2016-10-29T05:05:09.087 に答える