【问题标题】:How to access instance variables from one class to another如何从一个类访问实例变量到另一个类
【发布时间】:2020-04-14 07:56:23
【问题描述】:

我正在用 ruby​​ 创建一个简单的 Rock, Paper, Scissor OOP 游戏,以便更好地了解 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

【问题讨论】:

  • 不应该player1player2Main 中吗?玩家是Player,但不应包含两个玩家。
  • 如果 Player 对象有 2 个玩家属性,那么这些玩家也各有 2 个玩家,另外还有 2 个。换句话说,您需要无限数量的玩家来创建一个玩家。你应该重新考虑一下你的结构。您可能想要的是一个有 2 个玩家的 Game 对象/类。 Main 类名太通用了 imo
  • 很抱歉,我不明白为什么我的班级Player 不应该包含这两个玩家。那我会在播放器类中放什么?
  • Player 类应该只包含单个玩家的属性 - 在这种情况下,只是 name。您可以从Main 类中跟踪玩家列表(@player1@player2 等)
  • 好的,我现在明白了。感谢您清除它。我对代码进行了更改以使其现在可以工作。我会在上面编辑。但我确实有另一个问题,而不是将变量 name1name2 放入我的 greetingsGame 是否有办法让我将该变量放入我的方法 start 而不抛出 @ 987654343@错误?

标签: ruby oop instance-variables


【解决方案1】:

你可以这样做。

def greeting
  ...
  return name1, name2
end

def start
    game = Game.new
    name1,name2=game.greeting
    game.instruct
end

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2011-04-28
    • 2011-07-26
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多