2009-03-18 34 views

Trả lời

7

Xem biểu tượng hầu như luôn được tạo qua các chữ, không có nhiều khả năng xảy ra vụ nổ bộ nhớ tại đây. Hành vi của họ là khá nhiều yêu cầu của việc sử dụng của họ: mỗi khi bạn tham khảo một biểu tượng, nó là như nhau.

Tương tự, các chuỗi cần phải là duy nhất trong Ruby. Điều này là do cách chúng được sử dụng - xử lý văn bản, v.v.

Quyết định sử dụng tùy thuộc vào ngữ nghĩa của chúng, không tối ưu hóa sớm.

8

Nếu bạn tham khảo các biểu tượng tương tự trong vòng lặp của bạn, sau đó nó không phải tạo lại đối tượng mọi tức

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

Bây giờ nếu bạn sử dụng một chuỗi có thay vào đó, các chuỗi sẽ được tái tạo 10K lần . Nói chung, sử dụng các ký hiệu trong trường hợp bạn gần như đối xử với chữ như một hằng số hoặc một khóa. Một ví dụ rất tốt đối với tôi sẽ là

link_to "News", :action => 'news' 

thay vì

link_to "News", "action" => 'news' 

hành động được tái sử dụng hơn và hơn nữa trong ứng dụng của bạn.

+11

Tôi có thể thêm quy tắc: không bao giờ, chuyển đổi mọi chuỗi do người dùng cung cấp thành Biểu tượng. Điều đó sẽ mở ra khả năng tấn công DOS. – Arsen7

6

Nếu bạn đang sử dụng Ruby 2.2.0 hoặc mới hơn, bạn nên chọn tự động tạo nhiều ký hiệu vì chúng sẽ được thu gom theo Ruby 2.2.0-preview1 announcement, có liên kết đến more details about the new symbol GC. Tuy nhiên, nếu bạn truyền các ký hiệu động của bạn tới một loại mã nào đó chuyển đổi nó thành một ID (một khái niệm thực thi Ruby bên trong được sử dụng trong mã nguồn C), thì trong trường hợp đó nó sẽ bị ghim và không bao giờ thu gom rác. Tôi không chắc điều đó thường xảy ra như thế nào.

Khi quyết định có nên sử dụng những biểu tượng hoặc các chuỗi bạn nên xem xét:

  • biểu tượng không thể thay đổi sau khi được tạo ra.
  • Ký hiệu không có nhiều phương thức mà chuỗi có, như
  • Biểu tượng có thể được so sánh hiệu quả với nhau để bình đẳng.
  • Ký hiệu được cho là đại diện cho tên của một cái gì đó theo số Symbol docs. Tôi sẽ không sử dụng chúng để lưu trữ bất cứ thứ gì không thể được coi là một cái tên.
Các vấn đề liên quan