2016-11-14 6 views
0

다른 클래스 및 구조체의 클래스 목록을 가져 오려고합니다. 저는 현재 다음 코드Class.class 및 Struct.class의 Union 형식 배열

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 

이 코드는 매크로에서 생성됩니다. 이것이 가능한가? 내가 놓친 게 있니? 사전

답변

2

당신은 어느 푸도 바있는 배열, 내부 바즈 퍼팅에

덕분에, 그것은 노동 조합 유형 클래스입니다. 배열에서 Baz를 제거하면 잘 작동합니다.

+0

Baz를 배열에 넣고 싶다면 어떻게해야할까요? –

+1

하지만 왜 그렇게하고 싶습니까? 해결하고자하는 실제 문제를 설명하지 않고 무언가를하고 싶을 때 XY 문제에 부딪 힐 수도 있습니다. 아마도'Foo.class | Bar.class | Baz.class'가 효과가 있습니다. – asterite

+0

기본적으로 TypeDeclarations 배열을받는 매크로가 있습니다 (레코드와 유사). 그런 다음이 유형을 런타임에 채울 배열과 비교합니다. 이 배열에는 해당 클래스의 인스턴스가 포함됩니다. 그것은 작은 DSL의 일부입니다. 결국이 문제를 완전히 다르게 해결할 수있는 방법을 찾았습니다. 귀하의 답변에 감사드립니다. –