수색…


통사론

  • :상징
  • :'상징'
  • :"상징"
  • "기호".to_sym
  • % s {기호}

비고

문자열을 통한 기호 사용의 이점 :

1. 루비 기호는 O (1) 비교가있는 객체입니다.

두 문자열을 비교하려면 잠재적으로 모든 문자를 볼 필요가 있습니다. 길이가 N 인 두 문자열의 경우 N + 1 비교가 필요합니다.

def string_compare str1, str2
  if str1.length != str2.length
        return false
  end
  for i in 0...str1.length
    return false if str1[i] != str2[i]
  end
  return true
end
string_compare "foobar", "foobar"

그러나 foobar가 나타날 때마다 동일한 객체를 참조하므로 객체 ID를 통해 심볼을 비교할 수 있습니다. 우리는 하나의 비교로 이것을 할 수 있습니다. (O (1))

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. 루비 기호는 자유 형식 열거 형의 레이블입니다.

C ++에서는 "상수"를 사용하여 관련 상수의 계열을 나타낼 수 있습니다.

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

하지만 Ruby는 동적 언어이기 때문에 BugStatus 유형을 선언하거나 합법적 인 값을 추적 할 필요가 없습니다. 대신 열거 형 값을 기호로 나타냅니다.

original_status = :open
current_status  = :closed

3. 루비 기호는 상수, 고유 한 이름입니다.

Ruby에서는 문자열의 내용을 변경할 수 있습니다.

"foobar"[0] = ?b # "boo"

그러나 우리는 기호의 내용을 변경할 수 없습니다 :

:foobar[0]  = ?b # Raises an error

4. Ruby 기호는 키워드 인수의 키워드입니다.

루비 함수에 키워드 인수를 전달할 때, 심볼을 사용하여 키워드를 지정합니다 :

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. 루비 기호는 해시 키를위한 탁월한 선택입니다

일반적으로 기호를 사용하여 해시 테이블의 키를 나타냅니다.

options = {}
options[:auto_save]     = true
options[:show_comments] = false

심볼 만들기

Symbol 객체를 만드는 가장 일반적인 방법은 문자열 식별자 앞에 콜론을 붙이는 것입니다.

:a_symbol       # => :a_symbol
:a_symbol.class # => Symbol

다음은 String 리터럴과 함께 Symbol 을 정의하는 몇 가지 다른 방법입니다.

:"a_symbol"
"a_symbol".to_sym

기호는 %q%Q 가 문자열에 대해 작동하는 것과 유사한 임의의 구분 기호를 지원하는 %s 시퀀스를 가지고 있습니다.

%s(a_symbol)
%s{a_symbol}

%s 는 공백이 포함 된 입력에서 기호를 만드는 데 특히 유용합니다.

%s{a symbol} # => :"a symbol"

몇 가지 흥미로운 기호 ( :/ , :[] , :^ 등)는 특정 문자열 식별자로 만들 수 있지만 기호는 숫자 식별자를 사용하여 만들 수 없습니다.

:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...

기호는 하나의 기호로 끝날 수 ? 또는 ! 기호의 식별자로 문자열 리터럴을 사용할 필요가 없습니다.

:hello?  # :"hello?" is not necessary.
:world!  # :"world!" is not necessary.

심볼을 만드는 이들 서로 다른 메소드는 모두 같은 객체를 반환합니다.

:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id

Ruby 2.0 이후로 단어들로부터 심볼의 배열을 생성하는 지름길이 있습니다 :

%i(numerator denominator) == [:numerator, :denominator]

문자열을 기호로 변환

주어진 String :

s = "something"

Symbol 으로 변환하는 몇 가지 방법이 있습니다.

s.to_sym
# => :something
:"#{s}"
# => :something

기호를 문자열로 변환

주어진 Symbol :

s = :something

이를 String 으로 변환하는 가장 간단한 방법은 Symbol#to_s 메서드를 사용하는 것입니다.

s.to_s
# => "something"

이를 수행하는 또 다른 방법은 Symbol#to_s 메소드의 별명 인 Symbol#id2name 메소드를 사용하는 것입니다. 그러나 Symbol 클래스에 고유 한 메서드입니다.

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow