如何返回两个单独的键和值数组

时间:2014-06-12 20:55:40

标签: ruby arrays

请解释这段代码如何返回两个数组。

def keysAndValues(data)
  [data.keys, data.values]
end

2 个答案:

答案 0 :(得分:1)

keysAndValues方法确实返回一个数组(其中包含两个数组),但其输出可以解释为两个数组。让我解释一下:

single_array = ["hello", "world"]
puts single_array # => ["hello", "world"]
first_element, second_element = single_array
puts first_element # => "hello"
puts second_element # => "world"

这种表示法可能的原因是Ruby的赋值(=)运算符的实现。因此,调用a, b = keysAndValues(data)会使变量ab都填满。但请注意,虽然结果在技术上有意义,但在某些情况下可能会出乎意料:

first, second = 1 # first is 1, second is nil

还有一些其他用途可用于多次分配,请考虑以下情况:

a, b, *c = [1, 2, 3, 4] # note the asterisk symbol here
puts a # => 1
puts b # => 2
puts c # => [3,4]

答案 1 :(得分:1)

Ruby支持并行分配。这是一个简单的例子:

foo, bar = 1, 2
foo # => 1
bar # => 2

您的方法在数组中返回两个值:

keys_and_values(
  {
    a: 1,                    
    b: 2                     
  }                          
).size # => 2

通过=分配给等式左边的两个值。数组中的值是对keysvalues子数组所在位置的引用:

foo, bar = keys_and_values(
  {
    a: 1,                    
    b: 2                     
  }                          
)

foo.object_id  # => 70159936091440
bar.object_id  # => 70159936091420

Ruby在支持并行分配方面并不是唯一的;它也用于其他语言。任何体面的Ruby手册都会谈到这一点。理解是很好的,因为对变量的赋值或将多个参数传递给方法是Ruby中会反复遇到的。请a search获取更多信息。

另外,在Ruby中,我们没有使用camelCase命名方法,例如“keysAndValues”。相反,我们使用snake_case:keys_and_values