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
블록은 무엇입니까?
if (id < tLAST_TOKEN)
if (id < INT_MAX && rb_ispunct((int)id))
if (st_lookup(global_symbols.id_str, id, &data))
if (is_attrset_id(id))
그것의 일반적인 개요를 얻을 좋은 것입니다 무엇을 문 않는 경우, 그러나 아무튼 내부 코드의 각 블록 ' 선별 분석이 필요합니다.
마지막으로, to_s
의 메모리/가비지 수집 의미에 대해 궁금합니다. : Symbol#to_s
은 가비지 수집 될 때마다 새 문자열을 만들거나 내부 복사시 쓰기 최적화를 사용합니다. 캐릭터 라인에 돌연변이가있을 때까지 심볼의 내부 표현에 대한 참조?
'rb_id2str'은 그 이상입니다. 'Symbol # to_s'는 실제로'rb_sym_to_s'와 같습니다. 이 함수는'SYM2ID'를 사용하여 객체의 ID를 얻은 후에 만'SYM2ID'에 의해 반환 된 ID를 객체의 ID에서 문자열을 구성하는 매개 변수로 호출하여'rb_id2str'를 호출합니다. 내가 놓친 몇 가지 조치가있을 수 있습니다. 'to_s'와 관련된 메모리 사용법에 대해서는 확신하지만 새로운 문자열을 생성하지는 않을 것이라고 생각합니다. – omninonsense