Ruby: 类 中的 Procs 和 Blocks,数组作为变量

Ruby: Procs and Blocks in Classes, arrays as variables



我现在正在学习 Ruby,使用来自 http://www.humblelittlerubybook.com/book/html/chapter2.html
的教程 我目前所在的子章节是:"Methods and Variables"

我制作了一个 Boogeyman class 实例数组,我想调用这些实例的每个 'change_location' 方法并将它们的实例变量 @location 更改为数组指定的值。

前面的代码:

class Boogeyman
  def initialize(name, location)
    @name = name
    @location = location
    puts "Yes, Master?"
  end
  def change_location(newlocation)
    @location = newlocation
    puts "I moved to #{newlocation}."
    self.get_info
  end
  def change_name(newname)
    @name = newname
    puts "I shall be called #{newname} from now on!"
    self.get_info
  end
  def get_info
    puts "I am #{@name} in #{@location}."
  end
end

army = Array.new

army.push(Boogeyman.new("Mister Creepy", "New York, NY"))
army.push(Boogeyman.new("Loopy Lou", "Albuquerque, NM"))

locations = ["location1", "location2"]

换句话说:我想改变军队中所有恶魔的位置。
我已经学习了 .each 方法,并希望通过以下方式为数组 'locations' 提供其中的所有位置:

预期代码:

army.each {|boogeyman| boogeyman.change_location(locations)}

或:

army.each(locations) {|boogeyman| boogeyman.change_location(locations)}

预期结果:

I moved to location1!
I am Mister Creepy in location1.
I moved to location2!
I am Loopy Lou in location2.

实际结果:

I moved to ["place1", "place2"]!
I am Mister Creepy in ["place1", "place2"].
I moved to ["place1", "place2"]!
I am Loopy Lou in ["place1", "place2"].

对应

ArgumentError: wrong number of arguments (1 for 0)
  from (irb):158:in 'each'
  from (irb):158
  from /usr/local/bin/irb:11:in '<main>'



如您所见,结果与我预期的不同。我怀疑我的期望和实际代码之间的差异很小,但我无法找出它到底是什么。

PS。当您看到需要澄清或更正的内容时,请通知我。

boogeyman.change_location(locations) 将每个 Boogeyman 的 @location 设置为整个数组。您想要的是遍历 boogeyman 和他的位置对 (zip):

army.zip(locations).each { |boogeyman, location|
  boogeyman.change_location(location)
}

Amadan 的解决方案有效,但这里有另一个可能更容易遵循的解决方案:

army.each_with_index { |boogeyman, idx| boogeyman.change_location(locations[idx]) }

在您当前的代码中,您将整个数组 locations 传递给每个 Boogeymen,因此他们每个人的位置都将设置为数组 ["location1", "location2"]

相反,通过循环遍历并为循环遍历的每个恶魔分配 locations 数组的某个索引部分,您正在为存储在数组 locations 中的位置之一分配每个恶魔。