Mặc dù đã đọc " Tìm hiểu các ký hiệu Ruby ", tôi vẫn bối rối bởi cách biểu diễn dữ liệu trong bộ nhớ khi sử dụng các ký hiệu. Nếu một biểu tượng, hai trong số chúng được chứa trong các đối tượng khác nhau, tồn tại ở cùng một vị trí bộ nhớ, thì làm thế nào để chúng chứa các giá trị khác nhau ? Tôi đã mong đợi cùng một vị trí bộ nhớ chứa cùng một giá trị.
Đây là một trích dẫn từ liên kết:
Không giống như chuỗi, các ký hiệu cùng tên được khởi tạo và tồn tại trong bộ nhớ chỉ một lần trong một phiên của ruby
Tôi không hiểu cách nó quản lý để phân biệt các giá trị có trong cùng một vị trí bộ nhớ.
Hãy xem xét ví dụ này:
patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }
patient1.each_key {|key| puts key.object_id.to_s}
3918094
patient2.each_key {|key| puts key.object_id.to_s}
3918094
patient1
và patient2
cả hai đều là băm, điều đó tốt. :ruby
tuy nhiên là một biểu tượng. Nếu chúng ta phải xuất như sau:
patient1.each_key {|key| puts key.to_s}
Sau đó, những gì sẽ được đầu ra? "red"
, hoặc "programming"
?
Quên hàm băm trong một giây, tôi nghĩ rằng một biểu tượng là một con trỏ đến một giá trị. Các câu hỏi tôi có là:
- Tôi có thể gán giá trị cho một biểu tượng không?
- Có phải một biểu tượng chỉ là một con trỏ đến một biến có giá trị trong đó không?
- Nếu các biểu tượng là toàn cầu, điều đó có nghĩa là một biểu tượng luôn hướng đến một thứ?
puts patient1[:ruby]
, nó sẽ in "màu đỏ", nếu bạn nóiputs patient2[:ruby]
, nó sẽ in "lập trình".