class Testdeck
attr_accessor :cards
def initialize
@cards = []
counter = 0
['H','C', 'S', 'D'].product['2','3','4','5','6','7','8','9','10','J','K','Q','A'].each do |arr|
@cards << Card.new(arr[0], arr[1])
end
end
end
zen = Testdeck.new
puts zen.cards.pop
我花了最后一小时试图修复此错误。我得到的错误是:
wrong number of arugments (Argument Error)
答案 0 :(得分:7)
你错过了product
方法调用中的parens;试试这个:
def initialize
@cards = []
counter = 0
['H','C', 'S', 'D'].product(['2','3','4','5','6','7','8','9','10','J','K','Q','A']).each do |arr|
@cards << Card.new(arr[0], arr[1])
end
end
问题是您实际上正在访问[]
上的product
方法,这会导致在没有参数的情况下调用product
,然后对结果进行切片。
['H','C', 'S', 'D'].product # == [["H"], ["C"], ["S"], ["D"]]
由于你无法将13个参数传递给[]
(这是你的第二个数组的大小),这就是你得到wrong number of arguments (13 for 1..2)
的原因。
添加parens将使您的第二个数组成为product
和的参数,然后将在结果上调用each
,所以:
['H','C', 'S', 'D'].product[1, 2] # == [["C"], ["S"]]
['H','C', 'S', 'D'].product [1, 2] == ['H','C', 'S', 'D'].product([1, 2]) # == [["H", 1], ["H", 2], ["C", 1], ["C", 2], ["S", 1], ["S", 2], ["D", 1], ["D", 2]]
^ important separation here
正如您所看到的,您可以放弃()
并使用空格,但在您的情况下,您无法在以后链接each
,这就是您必须添加它们的原因
答案 1 :(得分:1)
您也可以写如下:
(['H','C', 'S', 'D'].product ['2','3','4','5','6','7','8','9','10','J','K','Q','A']).each do |arr|
答案 2 :(得分:0)
请参阅@NicoSantangelo回答它是正确的,这是使用map
初始化@cards
实例变量的版本
suites = ['H', 'C', 'S', 'D']
values = ('2'..'10').to_a + ['J', 'K', 'Q', 'A']
@cards = suites.product(values).map do |parts|
Card.new(parts[0], parts[1])
end