ruby mixin可以访问它所混入的类中存在的变量吗?

问题描述

我在终端上的井字游戏中迷路了,我制作了一个棋盘结构,并决定创建一个包含获胜条件的混入游戏。

我的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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...