联合类型的Class.class和Struct.class的数组

问题描述:

我想获得其他类和结构的类的列表。 我现在有以下代码(减少到最小)联合类型的Class.class和Struct.class的数组

struct Foo 
end 

class Bar 
end 

alias Baz = Foo.class | Bar.class 

types = [ 
    Foo, Bar, Foo, Foo, Bar, Baz 
] of Baz 

这使我以下错误:

Error in ./test.cr:9: instantiating 'Array(Bar:Class | Foo:Class):Class#build(Int32)' 

types = [ 
     ^

in ./test.cr:9: instantiating 'Array(Bar:Class | Foo:Class):Class#build(Int32)' 

types = [ 
     ^

in ./test.cr:9: no overload matches 'Pointer(Bar:Class | Foo:Class)#[]=' with types Int32, (Bar:Class | Foo:Class):Class 
Overloads are: 
- Pointer(T)#[]=(offset, value : T) 

types = [ 
     ^

我需要这个以执行在运行时生成的值和一个未知的类型检查类型。数组内的类型在编译时已知。我需要比较它们的类型不是。小例子(伪代码)

types = [TString, TFunc] # struct, class 
arg_0 = arguments[i] 
arg_type = types[i] 
if arg_0.is_a? arg_type 
    # passed 
else 
    # failed 
end 

此代码正在宏中生成。这可能吗?我错过了什么吗?

在此先感谢

你把巴兹的阵列,这既不富也不是酒吧里面,这是一个联合类型类。如果你从数组中删除Baz,那么它工作正常。

+0

如果我想将Baz放入阵列中,我会怎么做呢? –

+1

但你为什么要这么做?我们可能会遇到XY问题,您不想解释您正在尝试解决的实际问题而想做某些事情。可能是Foo.class | Bar.class | Baz.class'应该可以工作。 – asterite

+0

我基本上有一个宏将接收TypeDeclarations(类似于记录)的数组。然后我会将这些类型与在运行时填充的数组进行比较。这个数组将包含所述类的实例。它是一个小型DSL的一部分。 最后,我找到了一种解决方法,完全不同。感谢您的回答。 –