Как получить доступ к переменной экземпляра класса из другого класса, не создавая новый экземпляр этого класса - PullRequest
0 голосов
/ 17 января 2019

У меня есть класс Board, который создает хэш:

class Board
  attr_accessor :board

  def initialize
    @board = {}
  end

  def generate_board
    i = 0
    until i == 8
      @board[i] = [" . ", " . ", " . ", " . ", " . ", " . ", " . "," . "]
      i += 1
    end
  end
end

и я пытаюсь получить к нему доступ из другого класса:

class Pawn
  def legal_moves
    possible_moves = []
    if @board[@position[0] + 1][@position[1] + 1].is_a? Piece
      possible_moves << [[@position[0] + 1, @position[1] + 1]]
    end
    if @board[@position[0] + 1][@position[1] - 1].is_a? Piece
      possible_moves << [[@position[0] + 1, @position[1] - 1]]
    end
    @legal_moves = possible_moves
  end
end

Как я могу получить доступ к этому сохраненному состоянию доски, не создавая новый объект доски? Я не могу создать новый объект платы, потому что состояние доски должно быть постоянным. Я уже создал оригинальный экземпляр в другом классе, который играет в игру.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Если вы хотите получить дополнительный опыт в объектно-ориентированном программировании, вы можете использовать Singleton pattern :

require 'singleton'

class Board
  include Singleton

  attr_accessor :board

  def generate_board
    @board = {}
    i = 0
    until i == 8
      @board[i] = [" . ", " . ", " . ", " . ", " . ", " . ", " . "," . "]
      i += 1
    end
  end
end

В этом случае для генерации доски вам необходимо позвонить: Board.instance.generate_board

И когда вам нужен доступ к board из другого класса, вы можете добавить одну строку в init:

class Pawn
  def initialize
    @board = Board.instance.board
  end
end

Теперь вы можете использовать @board внутри Pawn объекта так же, как вы делаете это в своем примере:

@board[@position[0] + 1][@position[1] + 1]

Удачи!

0 голосов
/ 17 января 2019

Вы передаете доску новому экземпляру пешки.

class Pawn
  attr_reader :board, :location_x, :location_y

  def initialize(board)
    @board = board
    @location_x = nil
    @location_y = nil
  end

  def move(x, y)
    if board.get(x, y).nil?
      board.set(location_x, location_y, nil)
      self.location_x = x
      self.location_y = y
      board.set(x, y, self)
    else
      false
    end
  end
end

> board = Board.new
> pawn = Pawn.new(board)
> pawn.move(0,0)
> board.get(0,0) == pawn
=> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...