使用初始值的字符串到整数转换方法

时间:2017-09-04 13:10:10

标签: ruby

我有这段代码:

仓/移动:

#!/usr/bin/env ruby

require_relative '../lib/move.rb'

puts "Welcome to Tic Tac Toe!"
board = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
puts "Where would you like to go?"
index = gets.strip

input_to_index(index)
move(board, index, user_marker = "X")
display_board(board)

LIB / move.rb:

def display_board(board)
  puts " #{board[0]} | #{board[1]} | #{board[2]} "
  puts "-----------"
  puts " #{board[3]} | #{board[4]} | #{board[5]} "
  puts "-----------"
  puts " #{board[6]} | #{board[7]} | #{board[8]} "
end

def input_to_index(input)
  input = index.to_i - 1
end

def move(board, index, user_marker = "X")
  board[index.to_i] = user_marker
end

我运行了代码,得到了以下结果:

>ruby bin/move
Welcome to Tic Tac Toe!
Where would you like to go?
>6
/home/Tolenno/ttt-5-move-rb-cb-gh-000/lib/move.rb:10:in `input_to_index': undefined local v
ariable or method `index' for main:Object (NameError)
        from bin/move:10:in `<main>'

当我运行move时,它会使用来自用户的gets输入,而不是来自index的新input_to_index变量。我在某处做错了吗?

2 个答案:

答案 0 :(得分:1)

是的,你错了。正如错误消息所示,在move.rb第10行,input_to_index的方法正文中,您使用的是index,既未定义为方法,也未定义为变量。

  

索引是否未在'index = gets.strip'中定义?

没有。局部变量的范围永远不会超出单个文件。您不能在lib/move.rb中使用bin/move中定义的局部变量。

答案 1 :(得分:1)

你混淆了这些变量,但它很容易修复。

收集用户输入时,将其分配给名为input的变量(而不是index):

input = gets.strip

然后,将input传递给input_to_index并将结果分配给名为index的新变量:

index = input_to_index(input)

此外,更改您的input_to_index方法,以便转换给定的input

def input_to_index(string)
  string.to_i - 1
end

我故意更改了参数名称,以表明这是一个不同的变量。

替代

由于input是一个临时变量而且从未再次使用,因此您也可以内联并写入:

index = input_to_index(gets.strip)

并且input_to_index也没有做那么多。你可以考虑删除它,而不是写:

index = gets.to_i - 1

以上内容将读取用户的字符串,将其转换为整数(to_i忽略无关字符,包括换行符),减去1并将结果分配给index

建议

您的方法与Tic Tac Toe板有关。因此,您可以将它们与数组一起移动到Board类中(作为实例变量)。变化很简单:

class Board
  def initialize
    @board = Array.new(9, ' ')
  end

  def display
    puts " #{@board[0]} | #{@board[1]} | #{@board[2]} "
    puts "---+---+---"
    puts " #{@board[3]} | #{@board[4]} | #{@board[5]} "
    puts "---+---+---"
    puts " #{@board[6]} | #{@board[7]} | #{@board[8]} "
  end

  def move(index, user_marker = 'X')
    @board[index] = user_marker
  end
end

您可以使用这样的类:

puts "Welcome to Tic Tac Toe!"
board = Board.new

puts "Where would you like to go?"
index = gets.to_i - 1
board.move(index, 'x')
board.display

IMO,这比通过电路板更容易,代码看起来更清晰。