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
中的位置之一分配每个恶魔。
我现在正在学习 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
中的位置之一分配每个恶魔。