Symbol 클래스
Symbol 클래스
Symbol은 Ruby 인터프리터 안에서 "이름 붙은 식별자"를 나타내는 객체예요. 프로그램 전체에서 같은 이름은 항상 같은 심볼 객체로 취급되죠.
출처: Ruby 4.0 API
본문
Symbol 객체는 Ruby 인터프리터 안에서 이름 붙은 식별자(named identifier)를 나타내요.
심볼 객체는 다음으로 명시적으로 만들 수 있어요:
- 심볼 리터럴.
프로그램 실행 중에는 주어진 이름이나 문자열에 대해, 그 이름이 쓰이는 맥락이나 의미와 무관하게 항상 같은 Symbol 객체가 만들어져요. 그래서 Fred가 어떤 맥락에서는 상수, 다른 맥락에서는 메서드, 또 다른 맥락에서는 클래스라 해도, 심볼 :Fred는 세 맥락 모두에서 같은 객체예요.
module One
class Fred
end
$f1 = :Fred
end
module Two
Fred = 1
$f2 = :Fred
end
def Fred()
end
$f3 = :Fred
$f1.object_id #=> 2514190
$f2.object_id #=> 2514190
$f3.object_id #=> 2514190
세 심볼의 object_id가 모두 같은 걸 볼 수 있어요.
상수, 메서드, 변수의 이름도 심볼로 반환돼요:
module One
Two = 2
def three; 3 end
@four = 4
@@five = 5
$six = 6
end
seven = 7
One.constants
# => [:Two]
One.instance_methods(true)
# => [:three]
One.instance_variables
# => [:@four]
One.class_variables
# => [:@@five]
global_variables.grep(/six/)
# => [:$six]
local_variables
# => [:seven]
Symbol 객체는 String 객체와 달라요. Symbol은 식별자를 나타내고, String은 텍스트나 데이터를 나타낸다는 차이죠.
여기 뭐가 있나 (What's Here)
먼저 다른 데 있는 것부터요. 클래스 Symbol은:
- 클래스
Object에서 상속받아요. Comparable모듈을 포함해요.
여기서 Symbol 클래스가 제공하는 메서드는 이렇게 나뉘어요:
- 조회
- 비교
- 변환
조회 메서드
::all_symbols: 현재 Ruby의 심볼 테이블에 있는 심볼들의 배열을 반환해요.=~: 심볼에서 주어진Regexp나 다른 객체에 일치하는 첫 부분 문자열의 인덱스를 반환해요. 일치가 없으면nil.[],slice: 주어진 인덱스, 시작/길이, 범위 또는 문자열로 결정된 심볼의 부분 문자열을 반환해요.empty?:self.length가 0이면true.encoding: 심볼의 인코딩을 나타내는Encoding객체를 반환해요.end_with?: 심볼이 주어진 문자열 중 하나로 끝나면true.match: 심볼이 주어진Regexp와 일치하면MatchData객체를, 아니면nil을 반환해요.match?: 심볼이 주어진Regexp와 일치하면true.length,size: 심볼의 문자 수를 반환해요.start_with?: 심볼이 주어진 문자열 중 하나로 시작하면true.
비교 메서드
<=>: 주어진 심볼이self보다 작으면 -1, 같으면 0, 크면 1을 반환해요.==,===: 주어진 심볼이 같은 내용과 인코딩을 가지면true.casecmp: 대소문자를 무시하고 주어진 심볼이self보다 작으면 -1, 같으면 0, 크면 1을 반환해요.casecmp?: 유니코드 케이스 폴딩 후 심볼이 주어진 심볼과 같으면true.
변환 메서드
capitalize: 첫 문자를 대문자로, 나머지는 소문자로 바꾼 심볼을 반환해요.downcase: 모든 문자를 소문자로 바꾼 심볼을 반환해요.inspect: 심볼 리터럴로서의self의 문자열 표현을 반환해요.name: 심볼에 해당하는 frozen 문자열을 반환해요.succ,next:self의 다음 심볼을 반환해요.swapcase: 대문자는 소문자로, 소문자는 대문자로 바꾼 심볼을 반환해요.to_proc: 심볼이 이름으로 하는 메서드에 응답하는Proc객체를 반환해요.to_s,id2name:self에 해당하는 문자열을 반환해요.to_sym,intern:self를 반환해요.upcase: 모든 문자를 대문자로 바꾼 심볼을 반환해요.
Public Class Methods
all_symbols → array_of_symbols
현재 Ruby의 심볼 테이블에 있는 모든 심볼의 배열을 반환해요:
Symbol.all_symbols.size # => 9334
Symbol.all_symbols.take(3) # => [:!, :"\"", :"#"]
self <=> other → -1, 0, 1, or nil
String#<=>를 사용해 self와 other를 비교해요.
반환값:
other가 심볼이면self.to_s <=> other.to_s.- 그 외에는
nil.
예시:
:bar <=> :foo # => -1
:foo <=> :foo # => 0
:foo <=> :bar # => 1
:foo <=> 'bar' # => nil
Symbol 클래스는 Comparable 모듈을 포함하는데, 그 메서드들 각각은 비교에 Symbol#<=>를 사용해요. 관련: String#<=>.
symbol == object → true or false
object가 self와 같은 객체면 true, 아니면 false를 반환해요.
symbol =~ object → integer or nil
symbol.to_s =~ object와 같아요. 전역 변수에 대한 가능한 갱신을 포함해요. String#=~를 참고하세요.
symbol[index] → string or nil
symbol.to_s[]와 같아요. String#[]를 참고하세요.
capitalize(mapping) → symbol
sym.to_s.capitalize.to_sym과 같아요. String#capitalize를 참고하세요.
casecmp(object) → -1, 0, 1, or nil
Symbol#<=>와 같지만 대소문자를 구분하지 않아요. self.to_s.casecmp(object.to_s)와 같죠:
lower = :abc
upper = :ABC
upper.casecmp(lower) # => 0
lower.casecmp(lower) # => 0
lower.casecmp(upper) # => 0
self와 object의 인코딩이 호환되지 않거나, object가 심볼이 아니면 nil을 반환해요:
sym = 'äöü'.encode("ISO-8859-1").to_sym
other_sym = 'ÄÖÜ'
sym.casecmp(other_sym) # => nil
:foo.casecmp(2) # => nil
Symbol#casecmp?와 달리, 'A'..'Z'와 'a'..'z' 밖의 문자에는 대소문자 무시가 적용되지 않아요:
lower = :äöü
upper = :ÄÖÜ
upper.casecmp(lower) # => -1
lower.casecmp(lower) # => 0
lower.casecmp(upper) # => 1
관련: Symbol#casecmp?, String#casecmp.
casecmp?(object) → true, false, or nil
유니코드 케이스 폴딩 후 self와 object가 같으면 true, 아니면 false를 반환해요:
lower = :abc
upper = :ABC
upper.casecmp?(lower) # => true
lower.casecmp?(lower) # => true
lower.casecmp?(upper) # => true
self와 object의 인코딩이 호환되지 않거나, object가 심볼이 아니면 nil을 반환해요:
sym = 'äöü'.encode("ISO-8859-1").to_sym
other_sym = 'ÄÖÜ'
sym.casecmp?(other_sym) # => nil
:foo.casecmp?(2) # => nil
Symbol#casecmp와 달리 'A'..'Z'와 'a'..'z' 밖의 문자에도 동작해요:
lower = :äöü
upper = :ÄÖÜ
upper.casecmp?(lower) # => true
lower.casecmp?(lower) # => true
lower.casecmp?(upper) # => true
관련: Symbol#casecmp, String#casecmp?.
downcase(mapping) → symbol
sym.to_s.downcase.to_sym과 같아요. String#downcase를 참고하세요. 관련: Symbol#upcase.
empty? → true or false
self가 :''이면 true, 아니면 false를 반환해요.
encoding → encoding
self.to_s.encoding과 같아요. String#encoding을 참고하세요.
end_with?(*strings) → true or false
self.to_s.end_with?와 같아요. String#end_with?를 참고하세요.
inspect → string
앞의 콜론을 포함한 self의 문자열 표현을 반환해요:
:foo.inspect # => ":foo"
관련: Symbol#to_s, Symbol#name.
length → integer
self.to_s.length와 같아요. String#length를 참고하세요.
match(pattern, offset = 0) → matchdata or nil
self.to_s.match와 같아요. 전역 변수에 대한 가능한 갱신을 포함해요. String#match를 참고하세요.
match?(pattern, offset) → true or false
sym.to_s.match?와 같아요. String#match를 참고하세요.
name → string
앞의 콜론을 포함하지 않는 frozen 문자열 표현을 반환해요:
:foo.name # => "foo"
:foo.name.frozen? # => true
관련: Symbol#to_s, Symbol#inspect.
start_with?(*string_or_regexp) → true or false
self.to_s.start_with?와 같아요. String#start_with?를 참고하세요.
succ
self.to_s.succ.to_sym과 같아요:
:foo.succ # => :fop
관련: String#succ.
swapcase(mapping) → symbol
sym.to_s.swapcase.to_sym과 같아요. String#swapcase를 참고하세요.
to_proc
self의 이름을 가진 메서드를 첫 번째 인자에 호출하고 나머지 인자를 그 메서드에 넘기는 Proc 객체를 반환해요.
proc = :to_s.to_proc # => #<Proc:0x000001afe0e48680(&:to_s) (lambda)>
proc.call(1000) # => "1000"
proc.call(1000, 16) # => "3e8"
(1..3).collect(&:to_s) # => ["1", "2", "3"]
&:to_s 같은 루비 관용구의 실체가 바로 이 메서드예요.
to_s → string
앞의 콜론을 포함하지 않는 문자열 표현을 반환해요:
:foo.to_s # => "foo"
관련: Symbol#inspect, Symbol#name.
to_sym → self
self를 반환해요. 관련: String#to_sym.
upcase(mapping) → symbol
sym.to_s.upcase.to_sym과 같아요. String#upcase를 참고하세요.