Как создать конструктор копирования в Ruby - PullRequest
0 голосов
/ 15 декабря 2018

Я новичок в Ruby и программирую игру, в которой есть класс с именем Player, и у меня возникают проблемы при попытке скопировать объект.Мой код выглядит примерно так:

class Player

    attr_accessor :imprisoned
    attr_reader :name
    attr_reader :balance
    attr_accessor :freedom_card
    attr_accessor :current_box
    attr_reader :properties

    # Default constructor with no parameters
    def initialize (name = "")
        @name = name
        @imprisoned = false
        @balance = 7500
        @properties = Array.new
        @freedom_card = nil
        @current_box = nil
    end

    # Constructor with one parameter (it works)
    def self.nuevo (name)
        self.new(name)
    end

    # Copy constructor (doesn't seem to work)
    def self.copia (other_player)
        @name = other_player.name
        @imprisoned = other_player.imprisoned
        @balance = other_player.balance
        @properties = other_player.properties
        @freedom_card = other_player.freedom_card
        @current_box = other_player.current_box
        self
    end

    # ...
end

При тестировании с этим:

player = Player.nuevo ("John")
puts player.name
player_2 = Player.copia(player)
puts player_2.name

я получаю это:

John
NoMethodError: undefined method `name' for ModeloQytetet::Player:Class

В чем может быть ошибка?Он также не работает при использовании других атрибутов или методов из скопированного объекта, но все отлично работает в исходном.Заранее спасибо и прошу прощения за любые ошибки в английском (не мой родной язык).

1 Ответ

0 голосов
/ 16 декабря 2018

In:

def self.copia(other_player)
  @name = other_player.name
  @imprisoned = other_player.imprisoned
  @balance = other_player.balance
  @properties = other_player.properties
  @freedom_card = other_player.freedom_card
  @current_box = other_player.current_box
  self
end

@ относится к переменной экземпляра класса Player.вы на самом деле ничего не делаете, просто устанавливаете некоторые переменные и возвращаете self, который является классом , а не экземпляром

Вы можете сделать это с помощью

def self.copia(other_player)
  player = new(other_player.name)
  player.from(other_player)
  player
end

def from(other_player)
  @name = other_player.name
  @imprisoned = other_player.imprisoned
  @balance = other_player.balance
  @properties = other_player.properties
  @freedom_card = other_player.freedom_card
  @current_box = other_player.current_box
end
...