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
이 코드는 매크로에서 생성됩니다. 이것이 가능한가? 내가 놓친 게 있니? 사전
Baz를 배열에 넣고 싶다면 어떻게해야할까요? –
하지만 왜 그렇게하고 싶습니까? 해결하고자하는 실제 문제를 설명하지 않고 무언가를하고 싶을 때 XY 문제에 부딪 힐 수도 있습니다. 아마도'Foo.class | Bar.class | Baz.class'가 효과가 있습니다. – asterite
기본적으로 TypeDeclarations 배열을받는 매크로가 있습니다 (레코드와 유사). 그런 다음이 유형을 런타임에 채울 배열과 비교합니다. 이 배열에는 해당 클래스의 인스턴스가 포함됩니다. 그것은 작은 DSL의 일부입니다. 결국이 문제를 완전히 다르게 해결할 수있는 방법을 찾았습니다. 귀하의 답변에 감사드립니다. –