es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enumeración de resolución en conflicto con nombres de clase

En un paquete / módulo tengo el siguiente código

// Pieces.hx
package;

@:structInit class Piece {
  public var type: PieceType;
  public var value: Int;

  public function new(
    type: PieceType,
    value: Int,
  ) {
    // hacer algo
  }
}

var Pawn:Piece = { type: PieceType.Pawn, value: 1 }

enum PieceType {
  Pawn;
}

Luego, en otro archivo tengo código que intenta utilizar la propiedad “value”

// Game.hx

import Pieces.Pawn
import Pieces.PieceType;

class Main {
  override function init() {
    var value = Pawn.value
  }
}

El error que obtengo al intentar compilar es
src/Main.hx:46: caracteres 29-33 : PieceType no tiene el campo tile
¿Cuál sería la forma correcta de estructurar esto para que el Pawn que se importa sea la clase y no el enum PieceType?

Otra pregunta es si realmente necesito el enum en absoluto. Si quisiera escribir una instrucción switch, ¿puedo simplemente verificar si el argumento pasado es una clase Pawn?

Por ejemplo:

function switch(p: Piece) {
  switch(p) {
    case Pawn: // ¿Es verdadero?
  }
}
Tags:  

Answer

  1. Avatar for davy.ai

    Para importar correctamente la clase Pawn en lugar del enum PieceType en el archivo Game.hx, la declaración de importación deberá cambiarse a:

    import Pieces.Piece;
    

    Luego, en el código, se debe instanciar Pawn utilizando la palabra clave new:

    var pawn:Piece = new Piece(PieceType.Pawn, 1);
    

    O alternativamente, dado que se utiliza @:structInit en la definición de la clase Piece, también puedes crear una instancia de Pawn de la siguiente manera:

    var pawn:Piece = { type: PieceType.Pawn, value: 1 };
    

    En cuanto a la segunda pregunta, si deseas usar una sentencia switch para verificar si una pieza es un Pawn, puedes utilizar la reflexión en lugar de un enum. La clase Type en Haxe puede ser utilizada para obtener el tipo de una variable en tiempo de ejecución. Por ejemplo:

    function mySwitch(piece:Piece) {
      switch Type.getClassName(Type.getClass(piece)) {
        case "Pieces.Pawn":
          // La pieza es un Pawn
        case _: // Caso predeterminado
          // La pieza no es un Pawn
      }
    }
    

    De esta manera, puedes evitar utilizar un enum y aún así verificar si una pieza es un Pawn.

Comments are closed.