2011-08-11 42 views
6

Cách đơn giản nhất để chuyển đổi phạm vi 1..10 thành một băm của định dạng sau là gì?Ruby/Rails: Chuyển đổi phạm vi thành một băm

{ 
    1 => '£1', 
    2 => '£2', 
    # ... 
} 

Tôi đã thử làm điều này với map, nhưng kết thúc bằng một mảng băm chứ không phải một băm đơn.

Cảm ơn.

Trả lời

12
Hash[(1..10).map { |num| [num, "£#{num}"] }] 

hoặc

(1..10).inject({}) { |hash, num| hash[num] = "£#{num}"; hash } 

hoặc trong Ruby 1,9

(1..10).each_with_object({}) { |num, hash| hash[num] = "£#{num}" } 
+1

Các phương pháp như 'each_with_object' nhắc nhở tôi bao nhiêu Tôi yêu Ruby! +1 –

+0

Tuyệt vời, cảm ơn bạn! – gjb

+1

cần SWITCH | hash, num | để | num, hash | trong ví dụ cuối cùng ... khác có NoMethodError: phương thức undefined '[] = 'cho 1: Fixnum – jpwynn

2

Làm thế nào về:

h = {} 
(1..10).each {|x| h[x] = "£#{x}"} 
+4

Quy tắc đơn giản của ngón tay cái - mỗi khi bạn khai báo một giá trị rỗng (băm hoặc mảng) và sau đó lặp qua bộ sưu tập để điền/tổng hợp nó - sử dụng 'inject' – iafonov

+1

@ iafonov..for mảng, bạn có thể sử dụng' map'. – rubyprince

+0

@iafonov Tôi nhận ra đây là một bài đăng cũ, nhưng tôi đã thấy nhận xét của bạn (và tôi là người mới đối với Ruby), và nó khiến tôi tự hỏi * tại sao * bạn nên sử dụng 'inject'. Tôi không nói nó sai hay gì cả, tôi chỉ muốn hiểu lý do đằng sau nó như cách tiếp cận 'mỗi' ở trên là dễ đọc và dễ hiểu - và như tôi đã hiểu, thực hiện công việc. – Thor84no

1

một cách khác

h = Hash.new { |hash, key| hash[key] = "£#{key}" } 

mỗi phần tử sẽ có giá trị thích hợp hovever nó cũng sẽ trả lời h[100] những gì có thể gây ra lỗi

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