Symbol 리터럴

Symbol 리터럴

Symbol은 소스 코드 전체에서 고유한 이름을 나타내요.

Symbol은 컴파일 타임에 해석되고 동적으로 만들 수 없어요. Symbol을 만드는 유일한 방법은 심볼 리터럴인데, 콜론(:) 뒤에 식별자를 붙이는 형태예요. 식별자는 큰따옴표(")로 감쌀 수도 있어요.

:unquoted_symbol
:"quoted symbol"
:"a" # identical to :a
:あ

큰따옴표로 감싼 식별자에는 공백을 포함한 모든 유니코드 문자를 넣을 수 있고, 문자열 리터럴과 같은 이스케이프 시퀀스를 지원하지만 보간(interpolation)은 안 돼요.

따옴표가 없는 식별자에는 메서드와 같은 명명 규칙이 적용돼요. 영숫자 문자, 언더스코어(_), 또는 코드 포인트가 159(0x9F)를 초과하는 문자를 포함할 수 있어요. 숫자로 시작하면 안 되고, 느낌표(!)나 물음표(?)로 끝날 수 있어요.

:question?
:exclamation!

모든 Crystal 연산자는 따옴표 없이 심볼 이름으로 쓸 수 있어요.

:+
:-
:*
:/
:%
:&
:|
:^
:**
:>>
:<<
:==
:!=
:<
:<=
:>
:>=
:<=>
:===
:[]
:[]?
:[]=
:!
:~
:!~
:=~

내부적으로 Symbol은 Int32 타입의 숫자 값을 가진 상수로 구현돼요.

출처: Crystal 공식 문서

본문

퍼센트 심볼 배열 리터럴

단일 심볼 리터럴 외에도, 심볼의 배열을 만드는 퍼센트 리터럴이 있어요. %i와 한 쌍의 구분자로 표시해요. 사용 가능한 구분자는 괄호 (), 대괄호 [], 중괄호 {}, 꺾쇠 <>, 파이프 ||예요. 파이프를 제외한 모든 구분자는 중첩될 수 있어요. 즉 문자열 안의 시작 구분자가 다음 끝 구분자를 이스케이프해요.

%i(foo bar baz)  # => [:foo, :bar, :baz]
%i(foo\nbar baz) # => [:"foo\nbar", :baz]
%i(foo(bar) baz) # => [:"foo(bar)", :baz]

식별자는 모든 유니코드 문자를 포함할 수 있어요. 개별 심볼은 공백 문자 하나로 구분되는데, 그 공백을 식별자의 일부로 사용하려면 이스케이프해야 해요.

%i(foo\ bar baz) # => [:"foo bar", :baz]

더 알아보기

  • Hash 리터럴: Symbol을 키로 자주 쓰는 컬렉션
  • String 리터럴: 심볼 식별자의 이스케이프 규칙