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#<=>를 사용해 selfother를 비교해요.

반환값:

  • 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

objectself와 같은 객체면 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

selfobject의 인코딩이 호환되지 않거나, 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

유니코드 케이스 폴딩 후 selfobject가 같으면 true, 아니면 false를 반환해요:

lower = :abc
upper = :ABC
upper.casecmp?(lower) # => true
lower.casecmp?(lower) # => true
lower.casecmp?(upper) # => true

selfobject의 인코딩이 호환되지 않거나, 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를 참고하세요.