2012-11-08 35 views
7

Trong MRI, có vẻ như rb_id2str() có trách nhiệm thực hiện tất cả công việc khi bạn gọi Symbol#to_s. Tôi đã rất ngạc nhiên khi phát hiện ra đây là một hàm cực kỳ khó hiểu đối với một cái gì đó mà tôi cho là một hoạt động khá thẳng về phía trước.MRI Internals: giải thích chi tiết về rb_id2str

Tôi đang tìm kiếm giải thích chi tiết về chức năng này đang làm. Để tham khảo, đây là một liên kết đến các nguồn trong 1.9.3:

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

Một số câu hỏi cụ thể:

bốn lớn if khối đang làm gì?

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

Nó sẽ là tuyệt vời để có được một cái nhìn tổng quan chung về những gì mỗi khối mã bên trong nếu báo cáo không, nhưng nó doesn' t cần phải là một phân tích theo từng dòng.

Cuối cùng, tôi tò mò về ý nghĩa thu thập rác/bộ nhớ của to_s: gọi Symbol#to_s tạo chuỗi mới phải thu gom rác mỗi lần hoặc có thứ gì đó như tối ưu hóa sao chép nội bộ sử dụng một tham chiếu đến biểu diễn bên trong của biểu tượng cho đến khi một đột biến được tạo thành chuỗi?

+0

'rb_id2str' làm được nhiều hơn thế. 'Biểu tượng # to_s' thực sự tương đương với' rb_sym_to_s'. Hàm đó lấy ID của đối tượng bằng cách sử dụng 'SYM2ID' và chỉ sau đó nó gọi' rb_id2str' với ID được trả về bởi 'SYM2ID' làm tham số để xây dựng một chuỗi từ ID của đối tượng. Có thể có một số bước mà tôi bỏ qua, mặc dù. Tôi chắc chắn về việc sử dụng bộ nhớ liên quan đến 'to_s', nhưng tôi đoán (và hy vọng) nó không tạo ra một chuỗi mới – omninonsense

Trả lời

1

Đối với một điều, tôi khá chắc chắn Symbol # to_s tạo chuỗi mới. Hầu hết các lớp ruby ​​là cấu trúc C, ngoại trừ TrueClass, FalseClass, NilClass, Fixnum và Symbol, nằm trong C. Vì vậy Symbol là một câu chuyện hoàn toàn khác với String (Đó là lý do tại sao Symbol được khuyến nghị trừ khi bạn cần thay đổi giá trị rất nhiều).

Tôi không chắc chắn nếu bạn biết về cuốn sách của Ruby Hacking Hướng dẫn, nó giải thích rất nhiều về cách MRI được thực hiện trong C.

FYI, Ruby Hacking Guide được viết bằng tiếng Nhật, và cho đến bây giờ vẫn còn chỉ một phần nhỏ được dịch, có vẻ như kẻ đã từ bỏ nó. http://rhg.rubyforge.org/

Các vấn đề liên quan