为什么使用map方法时需要times方法?

Why is the times method needed when using the map method?

我对 "map" 方法的用法有疑问。为什么我在第 9 行得到 "No Method Error" ? Ruby 抱怨有一个名为 "map" 的未定义方法,在做了一些研究之后,我看到了一小段使用 "times" 方法的代码。令人惊讶的是,我的代码可以正常工作。但是,我对为什么需要使用时间感到困惑。

我最初的第 9 行语句是

nameArray = num.map do |x|

这不行,但为什么需要时间方法。为什么我不能使用 num 来显示我想在 x 上迭代 map 多少次?使用时间是访问地图方法的唯一方法吗?我很困惑...

下面是工作代码,只更改了第 9 行。

def Array_Maker 
  puts "How many people would you like to enter? : "
    num = gets.chomp.to_i

    nameArray = Array.new(num)

  puts "\nEnter the names of the people you wish to add: "

    nameArray = num.times.map do |x|
    gets.chomp.to_s
  end

  nameArray.each do |x| 
    puts x
  end
end  


Array_Maker()

map 方法适用于 Enumerable class 但是您是在 Fixnum 上使用它。因此错误。

Fixnum 没有实例方法map。这里:(感谢 Cary :)

Fixnum.instance_methods.include?(:map)
# => false

在这里参考 Enumerable#map: http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-map

当您执行 num.times 时,您正在将 num(Fixnum) 转换为 Enumerator class。这里:

num = 1
num.times
# => #<Enumerator: 1:times>
num.times.class
# => Enumerator

由于 Enumerator class 旨在允许迭代,因此 map 是此 class 的有效方法。因此 num.times.map.

没有错误

更新

之前我提到过 map 方法是针对数组 class 的。这虽然是正确的,但正如 Cary 指出的那样,这只是 Enumerable class 的一个简单实现。因此我相应地更新了我的答案。