我如何公开从 glm Haxe 库导入的类型以及我的 类?

How can I expose, together with my classes, the types imported from the glm Haxe lib?

我正在写一个 class,我将把它翻译成 Python 和 C#。 我的代码使用了很好的 "glm" 库。 Glm 提供有用的数据类型,例如:Vec3.

我可以让 Vec3 对 class 的 Python 和 C# 用户可见吗? 换句话说,我可以使用 Vec3 数据类型公开 public 方法吗?

这是一个带有 class 的示例 Haxe 代码,其 public 函数使用 Vec3 类型:

// Test execution:
// haxe -main TestGLM1 -lib glm --interp
// Translate into Python:
// haxe -main TestGLM1 -python TestGLM1.py  -lib glm 
// python3 TestGLM1.py

import glm.Vec3;
import glm.Quat;
import glm.Mat4;


class TestGLM1 {

    public function new() {
    }

    static function main() {

        // My test of the method taking 3D datatypes as input and output
        var t: TestGLM1 = new TestGLM1() ;
        var v1: Vec3 = new Vec3(1,2,3) ;
        var v2: Vec3 = new Vec3(7,8,9) ;
        t.testVecIO(v1, v2);

        trace(v1, v2);
    }

    public function testVecIO(vec_in: Vec3 , vec_out: Vec3) {
        vec_out.x = vec_in.x + vec_out.x;
        vec_out.y = vec_in.y + vec_out.y;
        vec_out.z = vec_in.z + vec_out.z;
    }
}

我想写一个这样的 Python 测试:

from TestGLM1 import TestGLM1
from TestGLM1 import glm_Vec3

print("Python Test...")

t = TestGLM1()

v1 = glm_Vec3(1,2,3)  # Vec3()
v2 = glm_Vec3(4,5,6)  # Vec3()
t.testVecIO(v1, v2)
print(v1, v2)

print("Python done.")

然而,这个测试失败了:

ImportError: cannot import name 'glm_Vec3'

因为我能在 TestGLM1.py 中看到的唯一 class 是:

class glm_Vec3Base:
    _hx_class_name = "glm.Vec3Base"
    __slots__ = ("x", "y", "z")
    _hx_fields = ["x", "y", "z"]

    def __init__(self):
        self.z = None
        self.y = None
        self.x = None

它有一个不友好的名称并且没有显示正确的构造函数。

有什么建议吗? 谢谢。

the only class that I can see in TestGLM1.py is glm_Vec3Base

那是因为 Vec3 是一个 abstract type,并且抽象仅在编译时存在。底层类型确实是一个名为 Vec3Base 的 class,如果您检查 Vec3.hx,您会注意到为什么它 "doesn't have a proper constructor":

class Vec3Base {
    function new() {}

    var x:Float;
    var y:Float;
    var z:Float;
}

您还可以注意到 Vec3 的所有方法都声明为 inline。如果它们不是(您可以通过使用 --no-inline 进行编译来强制这样做),您的 Python 输出将有一个名为 glm__Vec3_Vec3_Impl_ 的额外 class。它具有适用于所有 Vec3 方法的静态方法,因为这就是抽象在幕后的工作方式:

A good question at this point is "What happens if a member function is not declared inline" because the code obviously has to go somewhere. Haxe creates a private class, known to be the implementation class, which has all the abstract member functions as static functions accepting an additional first argument this of the underlying type.

总而言之,由于 Vec3 作为抽象实现,我认为没有方便的方法将其公开给 Python 或 C# 用户。通常,Haxe 生成的代码不太适合这样使用。这并不是说根本没有促进它的机制。例如,JavaScript 和 Lua 目标有 @:expose 元数据。