为什么我的代码在从我的数组中打印超过2个值时返回ArgumentError
?
代码:
gamestate = Array['1','2','3','4','5','6','7','8','9']
player = 'X' #x is the first player#
turns = 0 # number of turns that have passed
puts "TICTACTOE"#prints initial screen{#
puts gamestate[0,1,2]
puts gamestate[3,4,5]
puts gamestate[6,7,8]
错误:
Traceback (most recent call last):
1: from C:/Users/Hunter/Desktop/programming/rubyprograms/Basics/tictactoe.rb:5:in `<main>'
C:/Users/Hunter/Desktop/programming/rubyprograms/Basics/tictactoe.rb:5:in `[]': wrong number of arguments (given 3, expected 1..2) (ArgumentError)
<hr>
为什么我的代码在从我的数组中打印超过2个值时返回
ArgumentError
?
如错误信息所示:
Traceback (most recent call last): 1: from C:/Users/Hunter/Desktop/programming/rubyprograms/Basics/tictactoe.rb:5:in `<main>' C:/Users/Hunter/Desktop/programming/rubyprograms/Basics/tictactoe.rb:5:in `[]': wrong number of arguments (given 3, expected 1..2) (ArgumentError)
错误消息给出了错误细节,包括显示在执行的哪一点发生错误的堆栈跟踪,以及显示在源代码的哪一点发生错误的文件名和行号,但还有一个信息消息:
参数数错误(给定3,预期1..2)
所以,你传递了三个参数给方法[]
,但只接受一个或两个参数,我们也可以在Array#[]
的文档中清楚地看到:
如你所见,有四种不同的方式可以调用
array[index]
→或对象nil
array[start, length]
→对象或nil
array[range]
→对象或nil
array[aseq]
→对象或nil
[]
方法:
- 带有一个
Integer
(或任何隐式转换为Integer
的对象)参数,表示我们想要检索的对象的索引, - 带有两个
Integer
参数,表示我们要检索的子数组的开始索引和长度, - 带有一个
Range
参数,表示我们想要检索的子数组的开始和结束索引,以及 - 带有一个
Enumerator::ArithmeticSequence
参数,表示要检索的元素的索引顺序。
虽然有许多不同的选项,但none接受三个参数。
因为看起来您总是需要从某个特定索引开始的恰好三个连续的元素,您可以在这里使用第二种形式,它以起始索引和子数组的长度作为参数:
puts gamestate[0, 3]
puts gamestate[3, 3]
puts gamestate[6, 3]
如果您想在任意非连续索引处检索多个元素,您可以使用Array#values_at
代替。
你的风格不一致。您有时使用单引号,有时使用双引号,没有明显的原因。当有两种不同的表达方式时,你正在使用这两种不同的方式,人们会认为你想通过使用这两种不同的风格来表达一个重要的区别。然而,在这种情况下,似乎没有任何区别。通常最好总是使用单引号,除非你想使用字符串插值或需要特定的转义序列,或者字符串包含单引号:
puts 'TICTACTOE'
逗号后应有空格:
gamestate = Array['1', '2', '3', '4', '5', '6', '7', '8', '9']
和
puts gamestate[0, 1, 2] puts gamestate[3, 4, 5] puts gamestate[6, 7, 8]
这里不需要使用
Array::[]
方法,您可以使用正常的Array
字面语法来代替:gamestate = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
更好的是,您可以使用
%w
百分比字符串字面值:gamestate = %w[1 2 3 4 5 6 7 8 9]
或者,您也可以使用
Range
并将其转换为Array
:gamestate = ('1'..'9').to_a
因为它看起来像你正在模拟一个Tic Tat Toe游戏板,每三行三个单元格,线性
Array
可能不是表示它的最佳方式。嵌套的Array
可能更容易使用:gamestate = [ %w[1 2 3], %w[4 5 6], %w[7 8 9] ]
最好的表示方式是将游戏状态对象表示为
GameState
对象,因为这就是它的本质:游戏状态就是游戏状态,而不是字符串数组或字符串数组的数组。毕竟,Ruby是一种面向对象的语言,而不是面向字符串数组的语言。