2011-01-17 40 views
13

Tôi có một mảng của Ruby như thế nàyLàm thế nào để chuyển đổi một số nguyên ruby ​​thành một biểu tượng

q_id = [1,2,3,4,5,...,100] 

Tôi muốn lặp qua mảng và chuyển đổi thành một hash như thế này

{ 
    :1 => { #some hash} , 
    :2 => { #another hash}, 
    ... 
    :100 => {#yet another hash} 
} 

là gì cách ngắn nhất và thanh lịch nhất để thực hiện điều này?

[EDIT: to_s.to_sym trong khi tiện dụng không phải là cách tôi muốn. Xin lỗi vì đã không nhắc đến nó trước]

+0

Tôi không nghĩ đó là hợp pháp. Hãy thử gõ ': 1' trong' irb' và bạn sẽ nhận được một lỗi cú pháp. – detunized

+0

Như đã đề cập bên dưới,: 1 không hợp lệ. Điều tốt nhất bạn có thể nhận được là: "1". Tôi không chắc tại sao điều này lại quan trọng như vậy, vì các trích dẫn không thực sự là "một phần" của biểu tượng .. nhưng đó là cách nó phải được định nghĩa để phân tích cú pháp/lý do ngữ pháp. –

+3

Có lẽ bạn nên cho chúng tôi thấy những gì bạn đang thực sự cố gắng thực hiện. Tại sao bạn cảm thấy rằng bạn cần số-như-biểu tượng cho các phím của Hash của bạn? Làm thế nào bạn sau đó sẽ lập chỉ mục băm, hoặc nếu bạn lặp lại nó bạn sẽ làm gì với các phím? – Phrogz

Trả lời

26

Đối với việc tạo ra một biểu tượng, một trong những công việc:

42.to_s.to_sym 
:"#{42}" 

Các #inspect đại diện của các show diễn :"42" chỉ vì :42 không phải là một Symbol hợp lệ theo nghĩa đen. Hãy yên tâm rằng dấu ngoặc kép không phải là một phần của biểu tượng.

Để tạo băm, không có lý do gì để chuyển đổi khóa thành ký hiệu. Bạn chỉ nên làm điều này:

q_id = (1..100).to_a 
my_hash_indexed_by_value = {} 
q_id.each{ |val| my_hash_indexed_by_value[val] = {} } 

Hoặc này:

my_hash = Hash[ *q_id.map{ |v| [v,{}] }.flatten ] 

Hoặc này:

# Every time a previously-absent key is indexed, assign and return a new hash 
my_hash = Hash.new{ |h,val| h[val] = {} } 

Với tất cả các bạn có thể sau đó chỉ số băm của bạn trực tiếp với một số nguyên và có được một băm duy nhất trở lại, ví dụ

my_hash[42][:foo] = "bar" 

Không giống như JavaScript, nơi mỗi chìa khóa để một đối tượng phải là một chuỗi, Hashes trong Ruby chấp nhận bất kỳ đối tượng như chìa khóa.

+0

Cảm ơn bạn đã giải thích chi tiết !! – papdel

+1

':" 42 "' hoạt động giống như ':" # {42} "' –

+0

@AndrewGrimm, vâng; Tôi đã giả sử một biến sẽ được sử dụng thay cho '42', nhưng tôi cho rằng điều đó có thể không rõ ràng đối với những người mới đến. Cảm ơn bạn đã làm rõ. – Phrogz

0

u có thể sử dụng 1.to_s.to_sym

nhưng điều này sẽ làm cho biểu tượng như:. "1"

+0

xem ở trên chú thích – papdel

3

Để dịch một số nguyên thành một biểu tượng, sử dụng to_s.to_sym. ví dụ:

1.to_s.to_sym

Lưu ý rằng biểu tượng có liên quan nhiều hơn đến chuỗi hơn số nguyên. Nó có thể không hữu ích cho những thứ như sắp xếp nữa.

+0

Nó sẽ là ':" 1 "' không phải ': 1'. – detunized

+0

Phải, tôi đã thêm một làm rõ. Cảm ơn đã chỉ ra điều đó. –

+0

Vâng, như Andy đã đề cập, tôi đang tìm cách chuyển đổi nó thành: 1 và không: "1". Đã loại trừ phương thức to_sym trực tiếp – papdel

1

Như đã nêu,: 1 không phải là biểu tượng hợp lệ. Dưới đây là một cách để thực hiện những gì bạn muốn, nhưng với các phím như chuỗi:

Hash[a.collect{|n| [n.to_s, {}] }] 
1

Một mảng đối tượng bạn muốn trong băm sẽ dễ sử dụng hơn, phải không? Ngay cả một băm của các số nguyên sẽ làm việc khá tốt, phải không?

0

Thực ra "số biểu tượng" không phải là một thứ trong Ruby (hãy thử gọi phương thức to_sym trên một số). Lợi ích của việc sử dụng biểu tượng trong băm là về hiệu suất, vì chúng luôn có cùng số object_id (cố gắng gọi object_id trên chuỗi, booleans, số và ký hiệu).

Số có giá trị ngay lập tức và, như đối tượng Biểu tượng, chúng luôn có cùng object_id.

Dù sao, bằng cách sử dụng cú pháp băm mới ngụ ý sử dụng những biểu tượng như là chìa khóa, nhưng bạn luôn có thể sử dụng cũ tốt "tên lửa băm" cú pháp

awesome_hash = { 1 => "hello", 2 => "my friend" }

Tìm hiểu về các giá trị tức thời ở đây:

https://books.google.de/books?id=jcUbTcr5XWwC&pg=PA73&lpg=PA73&dq=immediate+values+singleton+method&source=bl&ots=fIFlAe8xjy&sig=j7WgTA1Cft0WrHwq40YdTA50wk0&hl=en&sa=X&ei=0kHSUKCVB-bW0gHRxoHQAg&redir_esc=y#v=onepage&q&f=false

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