问题描述
我在终端上的井字游戏中迷路了,我制作了一个棋盘结构,并决定创建一个包含获胜条件的混入游戏。
我的mixin有以下代码块:
class AsyncPipe {
其中COORDINATES哈希值是指我使用mixin的类中的常量,如下所示:
##check if 3 in a diagonal was made
diagonal_win = [[0,4,8],[2,6]]
##Deconstruction
diagonal_win.each_index do |item|
d_counter = 0
diagonal_win.each_index do |an_item|
x,y = COORDINATES[diagonal_win[item][an_item]]
if @structure[x][y] == 'X'
d_counter += 1
end #end of if block
end #an_item end
不幸的是,这似乎不起作用。我知道我可以将COORDINATES变量引入mixin,但是我想知道您是否真的无法通过mixin访问类中的常量,或者我做错了什么。
解决方法
否,因为COORDINATES
中的WinCondition
指向WinCondition::COORDINATES
。这是一个简单的例子。
module WinCondition
def show_coordinates
p COORDINATES
end
end
class Board
include WinCondition
COORDINATES = {
1 => [0,0],2 => [0,1],3 => [0,2],4 => [1,5 => [1,6 => [1,7 => [2,8 => [2,9 => [2,2]
}.freeze
end
Board.new.show_coordinates
test.rb:3:in `show_coordinates': uninitialized constant WinCondition::COORDINATES (NameError)
请使用类方法。
module WinCondition
def show_coordinates
p self.class.coordinates
end
end
class Board
include WinCondition
COORDINATES = {
1 => [0,2]
}.freeze
def self.coordinates
COORDINATES
end
end
Board.new.show_coordinates
使用类方法访问数据,即使只是包装一个常量的方法也有一些优点。
- 它允许子类覆盖
.coordinates
。常量不能被覆盖。 - 它允许
WinCondition
的子类和用户决定如何实现.coordiantes
。它们不限于常数。
例如。
class DynamicBoard < Board
def self.coordinates
# maybe load them from a file or something
end
end