Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 기호는 무엇이며 어떻게 작동합니까?

기호는 다음과 같습니다.

:테스트

기호를 변수와 혼동하는 사람도 있지만 변수와는 아무 상관이 없습니다...

...기호는 문자열과 훨씬 비슷합니다. .

그렇다면 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# 2453

10개의 새 기호를 생성하기 때문에 예상한 대로 총 기호 수가 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에 도입되었습니다.

새로운 것을 배웠기를 바랍니다!

이 게시물을 공유하여 더 많은 사람들에게 다가갈 수 있도록 해주세요 🙂