2015-12-25 61 views
0

我相信陣列主要用於從方法返回多個值:多個返回與數組值和哈希

def some_method 
    return [1, 2] 
end 

[a, b] = some_method # should yield a = 1 and b = 2 

我想這是一種即Ruby提供語法糖。我們可以得到與哈希類似的結果,例如

def some_method 
    return { "a" => 1, "b" => 2 } 
end 

{"c", "d"} = some_method() # "c" => 1, "d" => 2 

我正在尋找的結果{ "c" => 1, "d" => 2 },這顯然不會發生。有沒有其他辦法可以做到這一點?我知道,我們可以從方法返回一個哈希和存儲,並使用它,像這樣

def some_method 
    return {"a" => 1, "b" => 2} 
end 

hash = some_method() 

如果有一個類似與數組,但使用哈希另一種方式只是好奇....


我想提出這個問題將是一個更簡單的方法......所有的



    # If we have a hash 
    hash = {"a" => 1, "b" => 2} 

    # Is the following possible 
    hash = {2, 3} # directly assigning values to the hash. 
    OR 
    # another example 
    {"c", "d"} = {2, 3} # c and d would be treated as keys and {2, 3} as respective values. 

+0

無法複製。 – sawa

+0

甚至沒有重載'='操作符 –

+0

不清楚結果'{「c」=> 1,「d」=> 2}'中''c「'和'」d「'應該出現在哪裏從你的建議表單中'hash = some_method()'。 – sawa

回答

0

你問的是語法上不可能的。

你想完成什麼是可能的,但你必須編寫它。 一種可能的方式做到這一點如下所示

hash = {"a" => 1, "b" => 2} 

# Assign new keys 
new_keys = ["c", "d"] 
p [new_keys, hash.values].transpose.to_h 
#=> {"c"=>1, "d"=>2} 

# Assign new values 
new_values = [3, 4] 
p [hash.keys, new_values].transpose.to_h 
#=> {"a"=>3, "b"=>4} 

如果你真的想要做一些更容易尋找的方式,你可以猴子補丁Hash類,並確定新的方法來操作keysvalues數組的值。請注意,混淆核心類可能並不值得。無論如何,一個可能的實現如下所示。 使用您自己的風險。

class Hash 
    def values= new_values 
     new_values.each_with_index do |v, i| 
      self[keys[i]] = v if i < self.size 
     end 
    end 
    def keys= new_keys 
     orig_keys = keys.dup 
     new_keys.each_with_index do |k, i| 
      if i < orig_keys.size 
       v = delete(orig_keys[i]) 
       self[k] = v 
       rehash 
      end 
     end 
    end 
end 

hash = {"a" => 1, "b" => 2} 

hash.values = [2,3] 
p hash 
#=> {"a"=>2, "b"=>3} 

hash.keys = ["c", "d"] 
p hash 
#=> {"c"=>2, "d"=>3} 

hash.keys, hash.values = ["x","y"], [9, 10] 
p hash 
#=> {"x"=>9, "y"=>10} 

hash.keys, hash.values = ["x","y"], [9, 10] 
p hash 
#=> {"x"=>9, "y"=>10} 

# *** results can be unpredictable at times *** 
hash.keys, hash.values = ["a"], [20, 10] 
p hash 
#=> {"y"=>20, "a"=>10} 
+0

謝謝...我會給它一個去...希望學習新的東西,搞亂我的紅寶石安裝。 ;-) –

1

首先,你有一個語法錯誤。取而代之的是:

[a, b] = [1, 2] 

你應該使用:

a, b = [1, 2] 

如果你想使用散列類似的語法,你可以這樣做:

a, b = { "c" => 1, "d" => 2 }.values  # a => 1, b => 2 

這其實是一回事作爲數組版本,因爲Hash#values以它們被插入到散列的順序返回散列值的數組(因爲ruby散列具有保存它們的順序的好功能)

+0

感謝您的回覆。對不起,語法錯誤。所以只能使用數組而不使用散列來存儲結果。 –

+0

我以爲哈希永遠不會保存順序。此外,我正在考慮將散列分配給散列。在你提供的答案中。 [a,b]仍然被賦予一個數組[1,2]。這裏a和b可以用作變量。希望紅寶石具有類似的哈希函數 –

+0

@jc_john AFAIK,只有數組適用於此。直接使用散列實際上是不明確的,因爲它是一個鍵值數據結構。紅寶石如何確定是否要存儲密鑰,值或兩者的組合。所以在我上面的例子中,你可以使用'{「c」=> 1,「d」=> 2} .keys'和鍵來分配值而不是值。 –