为什么从这个数组中打印超过2个值会导致错误?

  • 本文关键字:2个 错误 打印 数组 arrays ruby
  • 更新时间 :
  • 英文 :


为什么我的代码在从我的数组中打印超过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是一种面向对象的语言,而不是面向字符串数组的语言。

最新更新