有关 ruby 中的实例方法的问题



我有一个任务,使用Ruby类构建井字游戏。

到目前为止,我是编程新手和自学成才,但被一个程序录取,需要完善一些概念才能领先于游戏。

我理解大多数概念,并让大多数规范文件适用于我的游戏,但我确实需要多次引用解决方案代码来帮助解决最后一点问题。

  1. 在创建板类时,创建了两个使用空数组定义的方法。我以前从未见过这种情况,想知道发生了什么。当我进入 IDE 并创建一个名为 [](空数组)和两个参数的方法时,我会收到一个错误(语法错误,预期输入结束)试图运行它。看来这一定是你只能在开课时做的事情?

    我假设这些是getter和setter方法?

    def [](pos)
    row, col = pos
    grid[row][col]
    end
    def []=(pos, value)
    row, col = pos
    grid[row][col] = value
    end
    
  2. 在上面的代码中,grid 是板类的实例变量。为什么您可以在方法中使用实例变量而不在其前面放置"@"符号 - (@grid,而不是网格)。这有点令人困惑,因为对于普通方法,如果在方法外部定义变量,则该方法无法识别它。为什么课堂内部不同?

    #example 
    x = 6 
    def add(b)
    x + b
    end 
    => will return an error - local variable x is undefined.
    

下面是全板课程,以防更好地理解和回答问题。谢谢!

class Board
attr_reader :grid, :marks
def initialize(grid = [])
if grid.empty?
@grid = Array.new(3) { Array.new(3) }
else
@grid = grid
end
@marks = [:X, :O]
end
def place_mark(pos, mark)
grid[pos[0]][pos[1]] = mark
end
def [](pos)
row, col = pos
grid[row][col]
end
def []=(pos, value)
row, col = pos
grid[row][col] = value
end
def empty?(pos)
grid[pos[0]][pos[1]].nil? ? true : false
end
def winner
(grid + grid.transpose + diagnol).each do |win|
return :X if win == [:X,:X,:X]
return :O if win == [:O,:O,:O]
end
nil
end
def diagnol
diag1 = [[0, 0], [1, 1], [2, 2]]
diag2 = [[0, 2], [1, 1], [2, 0]]
[diag1, diag2].map do |diag|
diag.map {|row, col| grid[row][col]}
end
end
def over?
return true if grid.flatten.compact.size == 9 || winner
return false if grid.flatten.compact.size == 0 || winner.nil?
end

end
  1. 是的,这是Board上数组对象的获取器和设置器。(FWIW 我认为这样做是糟糕的 Ruby 风格,所以我将来不会在您自己的代码中使用它。我认为这就是为什么您的 IDE 在此方法上也遇到问题的原因。
  2. 您可以使用不带 @ 的grid,因为类顶部有attr_reader声明。这将为类上公共的实例变量创建一个只读变量。它有效地创建了一个名为:

    def grid
    @grid
    end
    

    您将无法执行grid = [],因为attr_reader仅创建只读方法。要创建读写访问器,请使用attr_accessor。请记住,使用attr_方法会使有问题的变量在类上公开,因此如果您想在内部保留某些内容,则不会使用它们。

有点晚了,但我也在研究这个,并在网上找到了这个。显然,它是具有网格状实例变量的类的语法糖。

句法糖

这些都是获取左下角方块的等效方法:

board.grid[2][0]
board.[](2, 0)
board[2, 0] # syntactic sugar

语法糖允许我们使用我们的 方括号内而不是方括号内的参数 方括号后面的括号。

同样,以下是设置右上角的等效方法 广场:

board.grid[0][2] = :x
board.[]=(0, 2, :x)
board[0, 2] = :x  # syntactic sugar

当然,如果我们费心设置特殊的 [] 和 []= 方法, 我们将使用句法糖的方式。:)

更多信息可以从此链接中找到:

https://github.com/emgreen33/Practice/blob/master/W2D4/bracket-methods.md

最新更新