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)
Symbol은 Object 클래스에서 상속받고, 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
object가 self와 같은 객체면 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_json과 Symbol.json_create는 Symbol 객체를 직렬화·역직렬화하는 데 쓸 수 있어요. Symbol#as_json은 self를 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
유니코드 케이스 폴딩 후 self와 object가 같으면 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과 동등한 값이에요.