2011-12-30 39 views
23

Tôi có một băm nhưRuby - nhận được giá trị của băm

{:key1 => "value1", :key2 => "value2"}

Và tôi có một biến k đó sẽ có giá trị như 'key1' hoặc 'key2'.

Tôi muốn nhận giá trị k thành biến số v.

Có cách nào để đạt được điều này bằng cách sử dụng if hoặc case? Một giải pháp dòng đơn được ưu tiên. Hãy giúp tôi.

Trả lời

57

Chuyển đổi khóa từ chuỗi thành ký hiệu và thực hiện tra cứu trong hàm băm.

hash = {:key1 => "value1", :key2 => "value2"} 
k = 'key1' 

hash[k.to_sym] # or iow, hash[:key1], which will return "value1" 

Đường ray sử dụng lớp này được gọi là HashWithIndifferentAccess chứng minh là rất hữu ích trong các trường hợp như vậy. Tôi biết rằng bạn chỉ gắn thẻ câu hỏi của mình với Ruby, nhưng bạn có thể đánh cắp việc triển khai lớp này từ nguồn của Rails để tránh chuỗi ký hiệu và biểu tượng cho các chuyển đổi chuỗi trong toàn bộ codebase của bạn. Nó làm cho giá trị có thể truy cập được bằng cách sử dụng một biểu tượng hoặc một chuỗi làm khóa.

hash = HashWithIndifferentAccess.new({:key1 => "value1", :key2 => "value2"}) 
hash[:key1] # "value1" 
hash['key1'] # "value1" 
Các vấn đề liên quan