Symbol

Symbol

Symbol 객체는 Ruby 인터프리터 안의 **명명된 식별자(named identifier)**를 나타내요. 문자열과 달리 텍스트나 데이터가 아니라 '이름' 그 자체를 나타내는 데 쓰여요.

출처: Ruby 3.3 API

본문

Symbol 객체는 :name 같은 심볼 리터럴로 명시적으로 만들 수 있어요. 프로그램이 실행되는 동안 주어진 이름이나 문자열에 대해 같은 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

상수·메서드·변수 이름은 심볼로 반환돼요.

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)

SymbolObject 클래스에서 상속받고, Comparable 모듈을 포함해요. 클래스 Symbol은 다음에 유용한 메서드들을 제공해요.

조회(Querying) 메서드

  • ::all_symbols: 현재 Ruby의 심볼 테이블에 있는 심볼들의 배열을 돌려줘요.
  • =~: 주어진 Regexp 또는 다른 객체와 일치하는 심볼 내 첫 부분 문자열의 인덱스를 반환하고, 일치가 없으면 nil을 돌려줘요.
  • [], slice: 주어진 인덱스·시작/길이·범위·문자열로 결정되는 심볼의 부분 문자열을 돌려줘요.
  • empty?: self.length가 0이면 true, 아니면 false를 돌려줘요.
  • encoding: 심볼의 인코딩을 나타내는 Encoding 객체를 돌려줘요.
  • end_with?: 심볼이 주어진 문자열들 중 하나로 끝나면 true를 돌려줘요.
  • match: 심볼이 주어진 Regexp와 일치하면 MatchData 객체를, 아니면 nil을 돌려줘요.
  • match?: 심볼이 주어진 Regexp와 일치하면 true, 아니면 false를 돌려줘요.
  • length, size: 심볼의 문자 수를 돌려줘요.
  • start_with?: 심볼이 주어진 문자열들 중 하나로 시작하면 true를 돌려줘요.

비교(Comparing) 메서드

  • <=>: 주어진 심볼이 self보다 작으면 -1, 같으면 0, 크면 1을 돌려줘요.
  • ==, ===: 주어진 심볼이 self와 내용과 인코딩이 같으면 true를 돌려줘요.
  • casecmp: 대소문자를 무시하고 주어진 심볼이 self보다 작으면 -1, 같으면 0, 크면 1을 돌려줘요.
  • casecmp?: 유니코드 케이스 폴딩 후 주어진 심볼과 같으면 true, 아니면 false를 돌려줘요.

변환(Converting) 메서드

  • capitalize: 첫 문자를 대문자로, 나머지를 소문자로 바꾼 심볼을 돌려줘요.
  • downcase: 모든 문자를 소문자로 바꾼 심볼을 돌려줘요.
  • inspect: self를 심볼 리터럴로 표현한 문자열을 돌려줘요.
  • name: 심볼에 대응하는 frozen 문자열을 돌려줘요.
  • succ, next: 심볼의 후속(successor) 심볼을 돌려줘요.
  • 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) # => [:!, :"\"", :"#"]
json_create(o)

as_json을 참고하세요.

Public Instance Methods

symbol <=> object → -1, 0, +1, or nil

object가 심볼이면 symbol.to_s <=> object.to_s와 동등한 값을 돌려줘요. 아니면 nil을 돌려줘요.

:bar <=> :foo # => -1
:foo <=> :foo # => 0
:foo <=> :bar # => 1
:foo <=> 'bar' # => nil
symbol == object → true or false

objectself와 같은 객체면 true를, 아니면 false를 돌려줘요. ===도 이 메서드의 별칭이에요.

symbol =~ object → integer or nil

symbol.to_s =~ object와 동등한 값이에요. 전역 변수 갱신 가능성을 포함해요. String#=~을 참고하세요.

symbol[index] → string or nil
symbol[start, length] → string or nil
symbol[range] → string or nil
symbol[regexp, capture = 0] → string or nil
symbol[substring] → string or nil

symbol.to_s[]와 동등한 값이에요. String#[]를 참고하세요. slice는 별칭이에요.

as_json(*)

Symbol#as_jsonSymbol.json_createSymbol 객체를 직렬화·역직렬화하는 데 쓸 수 있어요. Symbol#as_jsonself를 2-요소 해시로 직렬화해요.

require 'json/add/symbol'
x = :foo.as_json
# => {"json_class"=>"Symbol", "s"=>"foo"}
Symbol.json_create(x) # => :foo
capitalize(*options) → 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
:foo.casecmp(2)      # => nil

Symbol#casecmp?와 달리 'A'..'Z', 'a'..'z'를 벗어난 문자에는 대소문자 무시가 적용되지 않아요.

casecmp?(object) → true, false, or nil

유니코드 케이스 폴딩 후 selfobject가 같으면 true를, 아니면 false를 돌려줘요.

lower = :abc
upper = :ÄÖÜ
upper.casecmp?(lower) # => true
:foo.casecmp?(2)      # => nil

Symbol#casecmp와 달리 'A'..'Z', 'a'..'z'를 벗어난 문자에서도 동작해요.

downcase(*options) → symbol

sym.to_s.downcase.to_sym과 동등한 값이에요. String#downcase를 참고하세요.

empty? → true or false

self:''이면 true, 아니면 false를 돌려줘요.

encoding → encoding

self.to_s.encoding과 동등한 값이에요.

end_with?(*strings) → true or false

self.to_s.end_with?와 동등한 값이에요. String#end_with?를 참고하세요.

inspect → string

self의 문자열 표현(앞의 콜론 포함)을 돌려줘요. :foo.inspect # => ":foo".

length → integer

self.to_s.length와 동등한 값이에요. size는 별칭이에요.

match(pattern, offset = 0) → matchdata or nil
match(pattern, offset = 0) {|matchdata| } → object

self.to_s.match와 동등한 값이에요. 전역 변수 갱신 가능성을 포함해요.

match?(pattern, offset) → true or false

sym.to_s.match?와 동등한 값이에요.

name → string

self의 frozen 문자열 표현(앞의 콜론 제외)을 돌려줘요. :foo.name # => "foo", :foo.name.frozen? # => true.

succ

self.to_s.succ.to_sym와 동등한 값이에요. :foo.succ # => :fop. next는 별칭이에요.

start_with?(*string_or_regexp) → true or false

self.to_s.start_with?와 동등한 값이에요.

swapcase(*options) → symbol

sym.to_s.swapcase.to_sym과 동등한 값이에요.

to_json(*a)

self를 나타내는 JSON 문자열을 돌려줘요.

to_proc

self의 이름을 가진 메서드를 첫 번째 매개변수에 호출하고 나머지 매개변수를 그 메서드에 전달하는 Proc 객체를 돌려줘요.

proc = :to_s.to_proc   # => #<Proc:0x000001afe0e48680(&:to_s) (lambda)>
proc.call(1000)        # => "1000"
(1..3).collect(&:to_s) # => ["1", "2", "3"]
to_s → string

self의 문자열 표현(앞의 콜론 제외)을 돌려줘요. :foo.to_s # => "foo". id2name은 별칭이에요.

to_sym → self

self를 돌려줘요. intern은 별칭이에요.

upcase(*options) → symbol

sym.to_s.upcase.to_sym과 동등한 값이에요.