2011-10-08 29 views
33

Có thích hợp để sử dụng số nguyên làm khóa trong băm Ruby không?Sử dụng số nguyên làm khóa băm

Mỗi ví dụ từ tài liệu cho thấy một chuỗi hoặc biểu tượng được sử dụng làm khóa, nhưng không bao giờ là số nguyên.

Nội bộ, các số nguyên sẽ được chuyển đổi thành chuỗi không? Tôi đã thấy một số thông tin xung đột về chủ đề này.

Nói cách khác, có bất kỳ bất lợi đáng kể nào khi sử dụng các phím số nguyên cho một băm không?

+2

Bạn đã thử chưa? Trên bàn điều khiển của bạn, bạn có thể gõ IRB và nhận được một bàn điều khiển ruby ​​.. khá hữu ích cho việc cố gắng loại điều này ... Về chủ đề, bạn sẽ có thể sử dụng số nguyên tốt. – Deleteman

+1

["ngoại trừ việc lập chỉ mục được thực hiện thông qua các khóa tùy ý của bất kỳ loại đối tượng nào"] (http://www.ruby-doc.org/core/Hash.html). Số nguyên là các đối tượng trong Ruby, do đó, Hashes cho vấn đề đó, do đó bạn có thể sử dụng Hashes làm khóa. –

Trả lời

42

tất nhiên bạn có thể sử dụng số nguyên như là chìa khóa ...

h = {1 => 'one', 2 => 'two', 3 => 'three'} 

(1..3).each do |i| 
    puts h[i] 
end 

=>

one 
two 
there 

IRB là bạn của bạn! thử nó ..


Trong thực tế, bạn có thể sử dụng bất kỳ của Ruby đối tượng như phím (hoặc giá trị). Chúng ta thường không nghĩ đến việc sử dụng Hashes như thế này, nhưng nó có thể khá hữu ích.

+0

Một điều tôi thấy thú vị về chữ băm với các phím số là bạn không thể sử dụng cú pháp {1: 'one', 2: 'two'}. Tôi đoán rằng cú pháp giả định mỗi phím là một biểu tượng, mà số nguyên không. – BlueMonkMN

+0

có, x: chỉ hoạt động đối với các ký hiệu – Tilo

9

Yêu cầu duy nhất để sử dụng đối tượng dưới dạng khóa băm là nó phải trả lời băm thông báo có giá trị băm và giá trị băm cho một khóa nhất định không được thay đổi. Ví dụ, nếu bạn gọi đây là:

1.hash() 

Bạn có thể thấy rằng số 1 thực sự đáp lại thông điệp băm

+0

Tôi nghĩ rằng nó được sử dụng để được như vậy trong 1.8. Nhưng tôi không chắc nó vẫn đúng trong 1.9. Tôi có nghĩa là, trong 1,9 bạn nhận được một băm miễn phí. – Candide

+0

Phải, tôi không có ý nói rằng bạn phải gọi hàm băm() một cách rõ ràng trên đối tượng bạn muốn sử dụng làm khóa - điều quan trọng là đối tượng thực hiện phương thức hash() (hoặc 'trả lời thông báo băm ', trong giao diện OO) –

+5

Nó cũng phải trả lời 'eql?'. –

3

Có đã trả lời về is it possible?.

Giải thích, tại sao không có ví dụ nào có số nguyên là Khóa băm.

Hash-keys có (hầu hết các lần) một ý nghĩa. Đó có thể là tên thuộc tính và giá trị của nó (ví dụ: :color => 'red' ...).

Khi bạn có số nguyên làm khóa, ngữ nghĩa của bạn có thể là 'đầu tiên, thứ hai ...' (1). Nhưng sau đó bạn không sử dụng một băm, nhưng một mảng để lưu trữ các giá trị của bạn.

(1) Ví dụ có thể là khóa ngoại trong cơ sở dữ liệu.

26

khác nhìn vào các câu trả lời ở đây có thể tìm thấy nó thú vị khi biết rằng một ngoại lệ xảy ra khi bạn sử dụng các số nguyên như phím biểu tượng trong một Ruby hash{symbol: value}

hash = {1: 'one'} # will not work 
hash = {1 => 'one'} # will work 

Giải thích yêu cầu:

Câu trả lời đơn giản nhất vì sao ví dụ đầu tiên bị lỗi có thể là to_sym không phải là phương pháp được triển khai cho Fixnum số nguyên.

Để đi sâu hơn để giải thích lý do tại sao, một trong những lợi ích chính để sử dụng biểu tượng là hai biểu tượng trên thực tế là "cùng một đối tượng". Hoặc ít nhất họ chia sẻ cùng một id đối tượng.

:foo.object_id == :foo.object_id 
=> true 

Các chuỗi giống nhau không chia sẻ cùng một đối tượng và do đó không chia sẻ cùng một id đối tượng.

"foo".object_id == "foo".object_id 
=> false 

Giống như các ký hiệu, số nguyên Fixnum giống nhau sẽ có cùng id đối tượng. Do đó bạn không thực sự cần phải chuyển đổi chúng thành các biểu tượng.

one = 1 
=> 1 
uno = 1 
=> 1 
one.object_id 
=> 3 
one.object_id == uno.object_id 
=> true 
Các vấn đề liên quan