2013-06-28 32 views
34

Nếu tôi lặp lại một lần băm, sau đó làm lại lần nữa mà không sửa đổi nội dung, các phím có được bảo đảm xuất hiện theo cùng một thứ tự không?Lệnh băm được lưu giữ giữa các lần lặp nếu không được sửa đổi?

Xét nghiệm nhanh cho thấy càng nhiều:

> h = {'a' => 1, 'b' => 2, 'c' => 3} 
> 100_000.times.map { h.to_s == h.to_s }.all? 
=> true 

Một câu hỏi, nếu ở trên được cho phép, tôi có thể lặp qua nó chỉ thay đổi giá trị, mà không cần thêm bất kỳ khóa mới, và có trật tự của các phím được không thay đổi?

tương tự như sau câu hỏi trăn: Do dicts preserve iteration order if they are not modified?

Không giống như trùng lặp đề nghị tôi không quan tâm đến việc liệu các yếu tố có một trật tự quy định đầy đủ, chỉ có những hạn chế mà hai lặp lại liên tục mà không sửa đổi cung cấp cùng một chuỗi.

+0

Vì cả hai câu trả lời đều cho biết, thứ tự chèn được duy trì. Điều này gây nhầm lẫn cho những người nghĩ rằng "sắp xếp" có nghĩa là "sắp xếp", mà họ không trừ khi chúng tôi đang cho phép một dấu thời gian vô hình bên trong lớp Hash. –

+1

Có thể trùng lặp của [Ruby: Thứ tự các khóa/giá trị được trả về bởi phương thức Hash.keys và Hash.values ​​là gì?] (Http://stackoverflow.com/questions/5208512/ruby-what-is-the-order- của-keys-values-return-by-hash-keys-và-hash-values-met) –

Trả lời

64

Trước 1,9, hành vi của băm được liệt kê không có trong đặc tả ruby ​​và do đó đã được triển khai - về cơ bản, hành vi/kiểu liệt kê băm không được xác định bởi ngôn ngữ và triển khai thực sự có thể làm bất cứ điều gì họ muốn (ngẫu nhiên? Thứ tự mỗi lần? Bất cứ điều gì đi!)

1.9+, liệt kê băm được chỉ định bởi ngôn ngữ được theo thứ tự chèn, vì vậy nếu bạn biết nền tảng của bạn là 1.9+, bạn có thể dựa vào nó .

RubySpec

+5

ruby ​​2.2.0+ không theo rubyspec nữa, xem http://rubini.us/2014/12/31/ matz-s-ruby-developers-don-t-sử dụng-rubyspec/ – johnlinvc

+0

Và rubyspec sinh sản trở lại sau hơn một nghìn cam kết http://eregon.github.io/rubyspec/2015/07/29/rubyspec-is -reborn.html – nurettin

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