我相信数组主要用于从方法中返回多个值:
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 :(得分:1)
首先,您遇到语法错误。而不是:
[a, b] = [1, 2]
你应该使用:
a, b = [1, 2]
如果你想在哈希中使用类似的语法,你可以这样做:
a, b = { "c" => 1, "d" => 2 }.values # a => 1, b => 2
这实际上与数组版本相同,因为Hash#values
按照它们插入到散列中的顺序返回散列值的数组(因为ruby散列具有保留其顺序的一个很好的特性)< / p>
答案 1 :(得分: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
类并定义新的方法来操纵keys
和values
数组的值。请注意,搞乱核心课程可能并不值得。无论如何,可能的实现如下所示。 使用您自己的风险。
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}