타입 문법

타입 문법 (Type grammar)

다음 상황에서는:

몇 가지 흔한 타입에 대해 편리한 문법이 제공돼요. 이들은 특히 C 바인딩을 작성할 때 유용하지만, 위 어느 위치에서든 쓸 수 있어요.

경로와 제네릭 (Paths and generics)

일반 타입과 제네릭을 쓸 수 있어요:

Int32
My::Nested::Type
Array(String)

유니온 (Union)

alias Int32OrString = Int32 | String

타입의 파이프(|)는 유니온 타입을 만듭니다. Int32 | String은 "Int32 또는 String"이라고 읽어요. 일반 코드에서 Int32 | StringInt32에 대해 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}Int32String을 요소로 담은 튜플 인스턴스예요. 위의 튜플 타입과는 다르다는 점을 기억하세요.

네임드 튜플 (NamedTuple)

alias Int32StringNamedTuple = {x: Int32, y: String}

이것은 다음과 같아요:

alias Int32StringNamedTuple = NamedTuple(x: Int32, y: String)

일반 코드에서 {x: Int32, y: String}xyInt32String을 담은 네임드 튜플 인스턴스예요. 위의 네임드 튜플 타입과는 다르다는 점을 기억하세요.

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

타입 문법에서 selfself 타입을 나타내는 데 쓸 수 있어요. 타입 제한 섹션을 참고하세요.

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)