2012-11-08 3 views
7

MRI에서 Symbol#to_s으로 전화 할 때 rb_id2str()이 모든 작업을 수행하는 것으로 나타납니다. 나는 이것이 상당히 직선적 인 작업이 될 것이라고 생각했던 것에 대한 매우 비밀스러운 기능이라는 것을 발견 한 것에 놀랐다.MRI 내부 : rb_id2str에 대한 자세한 설명

이 함수의 기능에 대한 자세한 설명을 찾고 있습니다.

http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950

일부 특정 질문 : 참고로, 여기에 1.9.3의 소스에 대한 링크입니다

하고 네 개의 주요 if 블록은 무엇입니까?

  1. if (id < tLAST_TOKEN)
  2. if (id < INT_MAX && rb_ispunct((int)id))
  3. if (st_lookup(global_symbols.id_str, id, &data))
  4. if (is_attrset_id(id))

그것의 일반적인 개요를 얻을 좋은 것입니다 무엇을 문 않는 경우, 그러나 아무튼 내부 코드의 각 블록 ' 선별 분석이 필요합니다.

마지막으로, to_s의 메모리/가비지 수집 의미에 대해 궁금합니다. : Symbol#to_s은 가비지 수집 될 때마다 새 문자열을 만들거나 내부 복사시 쓰기 최적화를 사용합니다. 캐릭터 라인에 돌연변이가있을 때까지 심볼의 내부 표현에 대한 참조?

+0

'rb_id2str'은 그 이상입니다. 'Symbol # to_s'는 실제로'rb_sym_to_s'와 같습니다. 이 함수는'SYM2ID'를 사용하여 객체의 ID를 얻은 후에 만'SYM2ID'에 의해 반환 된 ID를 객체의 ID에서 문자열을 구성하는 매개 변수로 호출하여'rb_id2str'를 호출합니다. 내가 놓친 몇 가지 조치가있을 수 있습니다. 'to_s'와 관련된 메모리 사용법에 대해서는 확신하지만 새로운 문자열을 생성하지는 않을 것이라고 생각합니다. – omninonsense

답변

1

Symbol # to_s는 새로운 문자열을 생성합니다. 대부분의 루비 클래스는 TrueClass, FalseClass, NilClass, Fixnum 및 Symbol을 제외한 C 구조체입니다. 따라서 Symbol은 String과 완전히 다른 이야기입니다. 따라서 값을 많이 변경해야하는 경우가 아니면 Symbol을 사용하는 것이 좋습니다). 나는이 책 루비 해킹 가이드에 대해 알고 있는지 확실하지 않습니다

, 그것은 MRI가

참고로 C로 구현하는 방법에 대해 많이 설명하고, 루비 해킹 가이드는 일본어로 작성하고, 경작한다 지금은 아직 거기에있다 사람들이 그것을 포기한 것 같이 작은 부분 만 번역됩니다. http://rhg.rubyforge.org/

관련 문제