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

时间:2015-02-21 05:51:02

标签: ruby methods

我对“地图”方法的使用有疑问。为什么我在第9行得到“No Method Error”? Ruby抱怨说有一个名为“map”的未定义方法,在做了一些研究后,我看到了一小段使用“times”方法的代码。令人惊讶的是,我得到了代码。但是,我很困惑为什么我需要使用时间。

我原来的第9行声明是

nameArray = num.map do |x|

这不起作用,但为什么需要时间方法。为什么我只是不能使用num来显示我想在x上映射迭代的次数?使用times是访问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()

1 个答案:

答案 0 :(得分:1)

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

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

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

请参阅此处的可枚举#map:http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-map

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

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

由于Enumerator类允许迭代,map是此类的有效方法。因此,num.times.map没有错误。

<强>更新

之前我曾提到map方法适用于Array类。虽然这是正确的,但正如Cary指出的那样只是 Enumerable类的简单实现。因此,我已相应更新了我的答案。