타입 문법
타입 문법 (Type grammar)
다음 상황에서는:
- 타입 제한을 지정할 때
- 타입 인자를 지정할 때
- 변수를 선언할 때
- alias를 선언할 때
- typedef를 선언할 때
- is_a? 의사 호출의 인자
- as 표현식의 인자
- sizeof 또는 instance_sizeof 표현식의 인자
- alignof 또는 instance_alignof 표현식의 인자
- 메서드의 반환 타입
몇 가지 흔한 타입에 대해 편리한 문법이 제공돼요. 이들은 특히 C 바인딩을 작성할 때 유용하지만, 위 어느 위치에서든 쓸 수 있어요.
경로와 제네릭 (Paths and generics)
일반 타입과 제네릭을 쓸 수 있어요:
Int32
My::Nested::Type
Array(String)
유니온 (Union)
alias Int32OrString = Int32 | String
타입의 파이프(|)는 유니온 타입을 만듭니다. Int32 | String은 "Int32 또는 String"이라고 읽어요. 일반 코드에서 Int32 | String은 Int32에 대해 String을 인자로 | 메서드를 호출한다는 뜻이에요.
Nil 가능 (Nilable)
alias Int32OrNil = Int32?
이것은 다음과 같아요:
alias Int32OrNil = Int32 | ::Nil
일반 코드에서 Int32?는 그 자체로 Int32 | ::Nil 유니온 타입이에요.
포인터 (Pointer)
alias Int32Ptr = Int32*
이것은 다음과 같아요:
alias Int32Ptr = Pointer(Int32)
일반 코드에서 Int32*는 Int32에 대해 * 메서드를 호출한다는 뜻이에요.
정적 배열 (StaticArray)
alias Int32_8 = Int32[8]
이것은 다음과 같아요:
alias Int32_8 = StaticArray(Int32, 8)
일반 코드에서 Int32[8]은 Int32에 대해 8을 인자로 [] 메서드를 호출한다는 뜻이에요.
튜플 (Tuple)
alias Int32StringTuple = {Int32, String}
이것은 다음과 같아요:
alias Int32StringTuple = Tuple(Int32, String)
일반 코드에서 {Int32, String}은 Int32와 String을 요소로 담은 튜플 인스턴스예요. 위의 튜플 타입과는 다르다는 점을 기억하세요.
네임드 튜플 (NamedTuple)
alias Int32StringNamedTuple = {x: Int32, y: String}
이것은 다음과 같아요:
alias Int32StringNamedTuple = NamedTuple(x: Int32, y: String)
일반 코드에서 {x: Int32, y: String}은 x와 y에 Int32와 String을 담은 네임드 튜플 인스턴스예요. 위의 네임드 튜플 타입과는 다르다는 점을 기억하세요.
Proc
alias Int32ToString = Int32 -> String
이것은 다음과 같아요:
alias Int32ToString = Proc(Int32, String)
파라미터 없는 Proc을 지정하려면:
alias ProcThatReturnsInt32 = -> Int32
여러 파라미터를 지정하려면:
alias Int32AndCharToString = Int32, Char -> String
중첩된 proc(그리고 일반적으로 모든 타입)에는 괄호를 쓸 수 있어요:
alias ComplexProc = (Int32 -> Int32) -> String
일반 코드에서 Int32 -> String은 구문 에러예요.
self
타입 문법에서 self는 self 타입을 나타내는 데 쓸 수 있어요. 타입 제한 섹션을 참고하세요.
class
class는 인스턴스 타입 대신 클래스 타입을 가리키는 데 쓰여요.
예를 들어:
def foo(x : Int32)
"instance"
end
def foo(x : Int32.class)
"class"
end
foo 1 # "instance"
foo Int32 # "class"
class는 클래스 타입의 배열과 컬렉션을 만들 때도 유용해요:
class Parent
end
class Child1 < Parent
end
class Child2 < Parent
end
ary = [] of Parent.class
ary << Child1
ary << Child2
밑줄 (Underscore)
타입 제한에서 밑줄을 쓸 수 있어요. 무엇이든 매칭돼요:
# Same as not specifying a restriction, not very useful
def foo(x : _)
end
# A bit more useful: any two-parameter Proc that returns an Int32:
def foo(x : _, _ -> Int32)
end
일반 코드에서 _는 밑줄 변수를 뜻해요.
typeof
typeof는 타입 문법에서 허용돼요. 전달된 표현식들의 타입을 합친 유니온 타입을 돌려줘요:
typeof(1 + 2) # => Int32
typeof(1, "a") # => (Int32 | String)
출처: Crystal 공식 문서
더 알아보기 (Learn more)
- 타입 제한에 대한 자세한 내용은 타입 제한 (Type restrictions) 문서를 확인해 보세요.