기호는 다음과 같습니다.
:테스트
기호를 변수와 혼동하는 사람도 있지만 변수와는 아무 상관이 없습니다...
...기호는 문자열과 훨씬 비슷합니다. .
그렇다면 Ruby 기호와 문자열의 차이점은 무엇입니까?
문자열은 데이터 작업에 사용됩니다. .
기호는 식별자입니다. .
이것이 주요 차이점입니다.
기호는 단순히 다른 종류의 문자열이 아니라 다른 목적을 가지고 있습니다.
기호를 사용하는 경우
기호의 가장 일반적인 용도 중 하나는 메소드 및 인스턴스 변수 이름을 나타내는 것입니다. .
예 :
attr_reader :제목
:title
attr_reader 뒤에는 @title
을 나타내는 기호입니다. 인스턴스 변수.
기호를 해시 키로 사용할 수도 있습니다.
예 :
해시 ={a:1, b:2, c:3}
혜택은?
기호는 더 좋아 보이고 변경 불가능하며 문자열 키와 기호 키를 벤치마킹하면 문자열 키가 약 1.70배 느립니다.
불변이란 모든 기호가 고유하다는 의미입니다. , 변경할 수 없음:
:rubyguides.object_id# 437768:rubyguides.object_id# 437768
이 두 기호는 동일한 개체입니다. 개체 ID가 동일하기 때문입니다.
기호는 send
와 같은 메타프로그래밍 방법에서 사용할 수 있습니다. :
[1,2,3].send(:첫 번째)
요약 :
이름으로 기호를 사용해야 합니다. 또는 사물에 대한 레이블(예:메서드) 및 데이터에 더 관심이 있을 때 문자열 사용 (개별 문자).
문자열과 기호 간 변환
필요한 경우 기호를 문자열로 변환할 수 있습니다.
왜 그렇게 하시겠습니까?
기호에는 String이 가진 메서드의 하위 집합만 있기 때문입니다.
그리고 기호는 변경할 수 없으므로 기호의 개별 문자로 작업하려면 문자열이 필요합니다.
to_s
를 사용하여 이 작업을 수행할 수 있습니다. 방법.
예를 들어 method_missing
을 사용하는 경우 누락된 메서드의 이름을 기호로 얻습니다. 이 메서드 이름이 특정 패턴(예:?
으로 끝나는 것)과 일치하는지 확인하고 싶을 수 있습니다. ).
예 :
def method_missing(method_name, *args, &block) if method_name.to_s[-1] =="?" # 다른 일을 하세요.문자열 개체를 기호 개체로 변환할 수도 있습니다.
이를 수행하는 방법은
String#to_sym
입니다. :"rubyguides".to_sym:rubyguides기호 배열 생성
기호 배열을 생성하려면 다음 코드를 사용할 수 있습니다.
기호 =%i(a b c)[:a, :b, :c]이렇게 하면 콜론과 쉼표를 입력하지 않아도 됩니다.
문자열 버전
%w
과 유사 :문자열 =%w(a b c)["a", "b", "c"]루비 심볼 비디오
기호 GC(고급)
기호에 대한 또 다른 흥미로운 사실은 다양한 유형이 있다는 것입니다.
그 이유는 Ruby 2.2 이전에는 심볼이 가비지 수집되지 않았기 때문입니다. 즉, 일반 Ruby 객체(문자열, 해시, 배열 등)처럼 더 이상 필요하지 않을 때 메모리에서 정리되지 않는 심볼이 존재한다는 의미입니다.
여기에서 예를 볼 수 있습니다. :
p Symbol.all_symbols.size# 2443('aa'..'aj').map(&:to_sym)GC.startp Symbol.all_symbols.size# 245310개의 새 기호를 생성하기 때문에 예상한 대로 총 기호 수가 10개 증가하는 것을 알 수 있습니다.
그러나 Ruby 2.2 이후로 이러한 기호는 일시적이고 이 코드의 다른 항목에서 사용되지 않기 때문에 메모리에서 제거됩니다.
Symbol GC가 활성화된 Ruby 버전에서 이 코드를 시도하면 두 기호 개수가 동일합니다.
일부 기호는 메모리에서 절대 제거되지 않으며 이를 "불멸의 기호"라고 합니다.
ObjectSpace 모듈을 사용하여 셀 수 있습니다.
'objspace'ObjectSpace.count_symbols{ :mortal_dynamic_symbol=>3, :immortal_dynamic_symbol=>5, :immortal_static_symbol=>3663, :immortal_symbol=>3668} 필요
:a1
과 같이 직접 생성된 기호에 유의하십시오. 자동으로 불멸의 상징이 됩니다. 새 메소드를 생성하면immortal_static_symbol
도 생성됩니다. 함께 가세요.그렇다면 필멸의 상징은 어디에서 왔습니까?
to_sym
을 사용하여 기호로 변환된 문자열에서 방법.
ObjectSpace.count_symbols
를 사용하여 직접 확인할 수 있습니다. .
immortal_dynamic_symbol
이 무엇인지 궁금하시다면 , 그것은 필멸에서 불멸로 승격된 상징입니다. 이것은 필멸 기호의 이름으로 메서드를 만들 때 발생할 수 있습니다.요약
이 기사에서 배운 내용:
- 기호는 변경할 수 없습니다.
- 기호는 값에 대한 포인터가 아니라 값 자체입니다.
- 문자열은 데이터용, 기호는 식별용
- 문자열과 기호 간 변환 방법
- Symbol GC는 임시 기호를 정리하기 위해 Ruby 2.2에 도입되었습니다.
새로운 것을 배웠기를 바랍니다!
이 게시물을 공유하여 더 많은 사람들에게 다가갈 수 있도록 해주세요 🙂