Ruby变量在类中不可访问

问题描述 投票:0回答:1

我试图将一个变量传递给许多类,但得到一个 "未定义局部变量或方法 "的错误。

我创建了一个'Player'类,它有一个方法来初始化一个带有两个参数的对象,并且有一个'Board'类,我想在其中使用其中一个参数(为了简单起见,我在下面加入了一个'put'语句),但这就是错误发生的地方。 在'Board'类之外,同样的语句也可以使用(目前已被注释掉)。

请问我如何在'Board'类中使用player1.name值? 谢谢你

class Player
attr_accessor :name, :symbol

  def initialize(name, symbol)
    @name = name
    @symbol = symbol
  end

end 


class Board

puts player1.name

end

player1 = Player.new("Player1","X")
#puts player1.name
ruby class variables
1个回答
0
投票

当你打开一个带有 class 关键字,你打开了一个新的作用域,当前的绑定就会被抛出窗外。此外,你的代码永远不会工作,因为你引用了 player1 然后再定义变量。

为了解决这两个问题,我们必须将变量中的 player1 的定义。然后不使用 class 关键字来定义 Board 类,我们可以使用 Class 构造者 其中保持当前的绑定。

这将导致。

player1 = Player.new("Player1","X")

Board = Class.new do
  puts player1.name
end

虽然这可能会解决你的问题,但我怀疑这是否是你真正需要的功能。这个问题充满了 XY问题. 上述内容将约束全班同学的。player1 的值是在类定义的时刻。

而这又意味着每一个 Board 在某种程度上必然会 player1. 我假设每一个实例 Board 可以有自己的播放器,在这种情况下,下面的方法会更适合。

class Board
  def initialize(player1)
    @player1 = player1
  end
end

0
投票

似乎你想调用的是... ... player1 里面 Board 类被创建之前。

这意味着 player1 在该上下文中不存在。

我想你可以在这个上下文中把它实例化到 Board 类或将其作为一个选项传递。下面是一个例子。

class Board
  def initialize(options={})
    # Uses the player passed to it.
    @player = options[:player]
  end

  # Not often seen since you can get it from the player class
  # but can be done here inside the Board class too if you want to.
  def player_name
    puts @player.name
  end

end

# Instantiate your player as usual.
player1 = Player.new("Player1","X")

# Adding it to an options hash
# this step is optional, you can add it directly to board
# like you did for adding the name and symbol to the player class.
options = {player: player1}

# Instantiate a board with the player you've created.
board = Board.new(options)

# To puts the player name run the method.
board.player_name # "Player1"

请看 Ruby类和模块 如果你想了解更多的例子和更多的知识。

© www.soinside.com 2019 - 2024. All rights reserved.