Как получить доступ к переменным экземпляра из одного класса в другой

Я сейчас создаю простую ООП-игру «Камень, ножницы, бумага» на Ruby, чтобы лучше понять, как все работает в Ruby OOP. Но я столкнулся с проблемой.

Я хочу получить доступ к переменной экземпляра из другого класса, но получаю эту ошибку при запуске программы

Traceback (most recent call last):
    2: from rps.rb:44:in `<main>'
    1: from rps.rb:40:in `start'
rps.rb:17:in `greeting': undefined method `name' for nil:NilClass (NoMethodError)

Строка 17 - это

puts "Welcome #{@player1.name} and #{@player2.name}"

Это весь мой код до сих пор

class Player
  attr_accessor :name, :player1, :player2,

  def initialize(name)
    @name = name
    @player1 = Player.new(name1)
    @player2 = Player.new(name2)
  end
end

class Main

  def greeting
    puts "Welcome to Rock-Paper-Scissor"
    sleep(0.5)
    puts "Welcome #{@player1.name} and #{@player2.name}"

  end 

  def instruct
    puts "The rules of the game are simple\n"
    puts "Choose Rock, Paper or Scissor each turn\n "
    puts "Paper beats Rock, Scissor beats paper and Rock beats Scissor\n"
    puts "Ready....?"
  end

end

def start
  puts "Hi, please enter your name player 1: "
  name1 = gets.chomp
  puts "Hi, please enter your name player 2: "
  name2 = gets.chomp

  game = Main.new
  game.greeting
  game.instruct
end

start

***** В код внесены новые изменения для правильной работы *******

class Player
    attr_accessor :name

    def initialize(name)
        @name = name
    end

end

class Game
    def greeting
        puts "Hi, please enter your name player 1: "
        name1 = gets.chomp
        @player1 = Player.new(name1)
        puts "Hi, please enter your name player 2: "
        name2 = gets.chomp
        @player2 = Player.new(name2)
        puts "Welcome to Rock-Paper-Scissor"
        sleep(0.5)
        puts "Welcome #{@player1.name} and #{@player2.name}"

    end 

    def instruct
        puts "The rules of the game are simple\n"
        puts "Choose Rock, Paper or Scissor each turn\n "
        puts "Paper beats Rock, Scissor beats paper and Rock beats Scissor\n"
        puts "Ready....?"
    end


end

def start
    game = Game.new
    game.greeting
    game.instruct

end 
start

person nimpa    schedule 22.12.2019    source источник
comment
Разве player1 и player2 не должны быть в Main? Игрок - это Player, но не должен содержать двух игроков.   -  person mu is too short    schedule 23.12.2019
comment
Если объект Player имеет 2 атрибута игрока, то у каждого из этих игроков есть по 2 игрока, а у этих - еще 2. Другими словами, вам нужно бесконечное количество игроков, чтобы создать одного игрока. Вам следует немного переосмыслить свою структуру. Вероятно, вам нужен Game объект / класс с двумя игроками. Main имя класса слишком общее, имо   -  person Viktor    schedule 23.12.2019
comment
Мне очень жаль, но я не понимаю, почему мой класс Player не должен содержать двух игроков. Что бы я тогда поместил в класс игрока?   -  person nimpa    schedule 23.12.2019
comment
Класс Player должен содержать атрибуты только одного игрока - в данном случае только name. Вы можете отслеживать список игроков (@player1, @player2 и т. Д.) Из класса Main   -  person max pleaner    schedule 23.12.2019
comment
хорошо, теперь я это понимаю. Спасибо, что прояснили это. Я внес изменения в код, чтобы он заработал. я отредактирую выше. Но у меня есть еще один вопрос: вместо того, чтобы помещать переменные name1 и name2 в мой greetings в Game, мог бы я поместить эту переменную в свой метод start, не выдавая undefined local variable or method method for name1 ошибку?   -  person nimpa    schedule 23.12.2019
comment
@nimpa: Ваша проблема связана не с доступом к переменной экземпляра, а с существованием методов, поскольку name - это метод, а не переменная. Чтобы ответить на ваш вопрос: сообщение об ошибке означает, что либо player1, либо player2 не класса Player и, следовательно, не имеет метода с именем name.   -  person user1934428    schedule 23.12.2019


Ответы (1)


вы можете сделать что-то вроде этого.

def greeting
  ...
  return name1, name2
end

def start
    game = Game.new
    name1,name2=game.greeting
    game.instruct
end
person Fernand    schedule 23.12.2019