【问题标题】:Why does printing more than 2 values from this array cause an error?为什么从这个数组打印超过 2 个值会导致错误?
【发布时间】:2021-05-05 07:28:39
【问题描述】:

为什么从我的数组中打印超过 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>

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    为什么从我的数组中打印超过 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)
    

    错误消息提供错误详细信息,包括显示错误发生在执行中的哪个点的堆栈跟踪,以及显示源代码中的哪个点的文件名和行号 em> 发生了错误,但也是一个信息性消息

    参数数量错误(给定 3,预期 1..2)

    所以,您向方法 [] 传递了三个参数,但它只接受一个或两个参数,正如我们在 the documentation of 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 percent string literal

      gamestate = %w[1 2 3 4 5 6 7 8 9]
      
    • 或者,您也可以使用Range 并将其转换为Array

      gamestate = ('1'..'9').to_a
      
    • 由于您正在为一个井字游戏板建模,每行包含三个单元格,每行三个单元格,线性 Array 可能不是表示它的最佳方式。嵌套的 Array 可能更容易使用:

      gamestate = [
        %w[1 2 3],
        %w[4 5 6],
        %w[7 8 9]
      ]
      
    • 不过,最好的表示是将您的游戏状态对象表示为GameState对象,因为它就是这样:游戏state 是游戏状态,不是字符串数组或字符串数​​组。 Ruby 是一种面向对象的语言,毕竟不是面向字符串数组的语言。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多