2014-08-27 66 views
6

我有我想要寫一個通用的檢查散列的數組,所以我想在一個鍵的名稱傳遞進行檢查。散列是用帶冒號前綴(符號)的鍵定義的。我無法弄清楚如何正確使用該變量作爲關鍵。即使密鑰存在於哈希中,使用該變量訪問它也會導致nil。如何通過變量訪問散列鍵?也許另外一個問題是,我如何將變量強制爲符號?如何通過變量訪問一個冒號哈希鍵紅寶石

在IRB我這樣做:

>> family = { 'husband' => "Homer", 'wife' => "Marge" } 
=> {"husband"=>"Homer", "wife"=>"Marge"} 
>> somevar = "husband" 
=> "husband" 
>> family[somevar] 
=> "Homer" 
>> another_family = { :husband => "Fred", :wife => "Wilma" } 
=> {:husband=>"Fred", :wife=>"Wilma"} 
>> another_family[somevar] 
=> nil 
>> 
+0

' 「丈夫」 .to_sym =>:husband'。 – 2014-08-27 22:33:50

回答

3

因爲你的鑰匙是符號,用符號鍵。

> hash = { :husband => 'Homer', :wife => 'Marge' } 
=> {:husband=>"Homer", :wife=>"Marge"} 
> key_variable = :husband 
=> :husband 
> hash[key_variable] 
=> "Homer" 
+0

這可能在某些情況下工作,但在我的情況下,我將它們作爲參數傳遞,而Trollop(參數解析gem)將不接受符號作爲默認值。 – Leonard 2014-08-28 00:01:58

1

您可以使用Active支持創業板去的with_indifferent_access方法訪問:

require 'active_support/core_ext/hash/indifferent_access' 
> hash = { somekey: 'somevalue' }.with_indifferent_access 
=> {"somekey"=>"somevalue"} 
> hash[:somekey] 
=> "somevalue" 
> hash['somekey'] 
=> "somevalue" 
+0

這使用[ActiveSupport核心擴展](http://edgeguides.rubyonrails.org/active_support_core_extensions.html),這是櫻桃挑選特定擴展的正確方法。 – 2014-08-27 23:14:20

0

您在哈希中看到的作爲變量鍵的東西被稱爲符號是Ruby中的結構。它們主要用作散列鍵或用於引用方法名稱。它們是不可改變的,並且在給定的時間只有任何符號的一個副本存在,所以它們可以節省內存。

您可以將字符串或符號與.to_sym或符號轉換爲字符串.to_s說明這讓我告訴這個例子:

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"] 
symbolArray = [:HTML, :CSS, :JavaScript, :Python, :Ruby] 
# Add your code below! 

symbols = Array.new 
strings.each {|x| 
symbols.push(x.to_sym) 
} 

string = Array.new 
symbolArray .each {|x| 
string.push(x.to_s) 
} 
print symbols 
print string 

的結果將是:

[:HTML, :CSS, :JavaScript, :Python, :Ruby] 
["HTML", "CSS", "JavaScript", "Python", "Ruby"] 

在紅寶石9.1中,您會看到帶有冒號(:)的符號代替:

movies = { peter_pan: "magic dust", need_4_speed: "hey bro", back_to_the_future: "hey Doc!" } 

我剛剛w爲了使這一點更亂扔垃圾,所以誰會閱讀這個可以使用。

最後一件事,這是另一種方式來解決問題:

movie_ratings = { 
    :memento => 3, 
    :primer => 3.5, 
    :the_matrix => 3, 

} 
# Add your code below! 

movie_ratings.each_key {|k| 
puts k.to_s 
} 

結果:

memento 
primer 
the_matrix