심볼(Symbols)
:class
:lvar
:method!
:andthisis?
:$gvar
:@ivar
:@@cvar
:+
Symbol클래스의 인스턴스. 문자열과 Symbol오브젝트는 일대일 대응한다.:
의 뒤에는 식별자, 메소드명(접미사에 !
, ?
=
포함), 변수명(접두사에$
포함), 지정의 가능한 연산자 몇 개가 올 수 있다.
Ruby의 내부에서는 메소드명이나 변수명, 상수명, 클래스명 등의 이름
을 상수로 관리하고 있는데, 이 상수를 Ruby코드 상에서 표현한 것이 Symbol이다. Symbol은 소스코드상에서 문자열처럼 보이며, 내부에서는 상수로서 처리되어 양자간의 매개체 역할을 한다.
Symbole은 변경불가능한 immutable한 객체, 한 번 값이 assign되고 나면 값을 변경하는 것이 불가능하다. (정확히 말하면 객체가 갖고 있는 값을 변경할 수는 없지만 덮어쓰기할 수는 있다는 의미). 문자열과 달리 같은 값을 갖고 있다면 같은 객체
p "abc" == "abc" #=> true
p "abc".equal?("abc") #=> false
p :abc == :abc #=> true
p :abc.equal?(:abc) #=> true
심볼은 immutable하기 때문에 한번 heap메모리상에 생성되고 나면 동일한 객체로 재사용이 가능
문자열에 비해(문자열 객체는 동일한 문자열도 다른 메모리값을 갖으므로) 메모리 효율성이나 성능측면에서 유리하다. 이러한 이유로 hash의 키 등으로 문자열을 사용하는 것보다 심볼을 사용하는 것이 좋다.
인스턴스메소드
self <=> other -> -1 | 0 | 1**
self와 other의 symbol에 대응하는 문자열의 ASCII코드 순으로 비교하여 self가 큰 경우 1, 동등한 경우 0, 작은 경우 -1을 반환
p :aaa <=> :xxx # => -1
p :aaa <=> :aaa # => 0
p :xxx <=> :aaa # => 1
self == other -> true | false**
두 symbol이 같은 값을 갖는지 확인
:aaa == :aaa #=> true
:aaa == :xxx #=> false
self =~ other -> Integer | nil**
정규표현의 other와 매치되는지 판정, 매치된다면 매치된 위치의 인덱스를, 아니라면 nil을 반환
(self.to_s =~ other과 같음)
p :foo =~ /foo/ # => 0
p :foobar =~ /bar/ # => 3
p :foo =~ /bar/ # => nil
id2name
symbol에 대응하는 문자열을 반환, 반대로 문자열에 대응하는 symbol을 얻을 때는 intern을 사용
p :foo.id2name # => "foo"
p :foo.id2name.intern == :foo # => true
'프로그래밍 > Ruby' 카테고리의 다른 글
Ruby : Literals(Booleans, Numbers, String) (0) | 2020.09.20 |
---|---|
Ruby(변수와 상수) (0) | 2020.09.15 |
Ruby설치하기(Mac) (0) | 2020.09.14 |
Ruby Programing(Intro) (0) | 2020.09.14 |