2

本教程中的练习之一是:

map利用总是返回数组的事实:编写一个hash_keys接受散列并对其进行映射的方法以返回线性中的所有键Array

解决方案是:

def hash_keys(hash)
    hash.map { |pair| pair.first }
end

但是,我无法理解上述工作的原因。例如,我写了一个同样有效的解决方案:

def hash_keys(hash)
    # Initialize a new array
    result = Array.new

    # Cycle through each element of the hash and push each key on to our array
    hash.map { |x,y| result.push(x) }

    # Return the array
    result
end

我可以理解为什么我的方法有效,但我不理解他们提出的解决方案。例如,他们甚至没有创建 Array 对象。他们不返回任何东西。似乎他们只是列出了每个键/值元素数组中的第一个元素。

4

4 回答 4

4

我想你误解了map. 它不只是迭代给定的集合(这就是each它的用途) - 它创建一个数组,其中每个元素都是使用原始集合的相应元素调用块的结果。

您的解决方案也可以(并且应该)使用each而不是编写,map因为您并没有真正使用map它 - 您只是利用它为给定集合中的每个元素调用其块一次的事实。

于 2013-04-29T15:07:03.970 回答
2

map应用于散列时,散列被转换为数组。这就是为什么不需要显式转换为数组的原因。并map通过用评估块的结果替换原始数组的每个项目来返回一个数组。每次评估块时,都会给它一个数组,该数组是一对键和它的值。first适用于该对并返回密钥。map返回这些键的数组。

于 2013-04-29T15:08:26.860 回答
1

map将一个Enumerable对象变成一个Array. 这就是它的作用。该块根据接收器中的每个元素描述了结果数组中的相应元素应该是什么。

所以,一个更简单的例子mapArray

[1,2,3,4].map {|n| n*2}
# => [2,4,6,8]

也就是 - 从[1,2,3,4],生成一个新的 Array,其中每个元素是 中等效条目的两倍[1,2,3,4]

于 2013-04-29T15:07:46.520 回答
1

你的答案有一半是正确的:“利用 map 总是返回一个数组的事实。” 您不需要显式创建数组,因为map它会为您完成。

至于返回它,您似乎已经知道 ruby​​ 方法的最后一行是它的返回值。在本教程的解决方案中,由于哈希在最后(也是唯一的一行)创建了一个数组,因此该数组是从方法返回的。

于 2013-04-29T15:08:12.920 回答