我试图将一个变量传递给许多类,但得到一个 "未定义局部变量或方法 "的错误。
我创建了一个'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
当你打开一个带有 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
似乎你想调用的是... ... 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类和模块 如果你想了解更多的例子和更多的知识。