2012-11-08 13 views
7

W MRI wygląda na to, że rb_id2str() jest odpowiedzialny za wykonanie całej pracy po wywołaniu Symbol#to_s. Byłem zaskoczony, gdy odkryłem, że jest to niezwykle tajemnicza funkcja dla czegoś, co według mnie byłoby dość prostą operacją.MRI Internals: szczegółowe wyjaśnienie rb_id2str

Szukam szczegółowego wyjaśnienia, co robi ta funkcja. Dla porównania, tutaj jest link do źródła w 1.9.3:

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

Niektóre konkretne pytania:

Jakie są cztery główne bloki if robi?

  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))

Byłoby wspaniale, aby uzyskać ogólny przegląd tego, co każdy blok kodu wewnątrz if robi, ale nie robi” t musi być analizą liniową.

Wreszcie, ciekawi mnie konsekwencje związane z pamięcią/usuwaniem śmieci: to_s: czy wywołanie Symbol#to_s tworzy nowy ciąg, który musi być zawsze usuwany ze śmiecia, czy też jest coś takiego jak wewnętrzna optymalizacja kopiowania przy zapisie, która wykorzystuje odniesienie do internowanej reprezentacji symbolu aż do wprowadzenia mutacji w ciągu znaków?

+0

'rb_id2str' robi o wiele więcej niż tylko to. 'Symbol # to_s' jest faktycznie równoważny' rb_sym_to_s'. Ta funkcja pobiera identyfikator obiektu za pomocą 'SYM2ID' i tylko wtedy wywołuje' rb_id2str' z identyfikatorem zwróconym przez 'SYM2ID' jako parametr do skonstruowania łańcucha z identyfikatora obiektu. Jednak mogą być pewne kroki, które przeoczyłem. Jestem pewien co do użycia pamięci związanej z 'to_s', ale zgaduję (i mam nadzieję), że nie tworzy on nowego ciągu – omninonsense

Odpowiedz

1

Po pierwsze, jestem pewien, że Symbol # to_s tworzy nowy ciąg. Większość klas ruby ​​to C, z wyjątkiem TrueClass, FalseClass, NilClass, Fixnum i Symbol, które są int w C. Więc Symbol jest zupełnie inną historią z String (Dlatego zaleca się Symbol, chyba że musisz bardzo często zmieniać wartość).

Nie jestem pewien, czy wiesz o książce Ruby Hacking Guide, to wyjaśnia wiele o tym, jak MRI jest zaimplementowana w C

FYI, Ruby Hacking Podręcznik jest napisany w języku japońskim, i do teraz jest jeszcze tylko niewielka część jest tłumaczona, wygląda na to, że faceci zrezygnowali z niej. http://rhg.rubyforge.org/