3

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

我可以让Vec3我班级的 Python 和 C# 用户看到吗?换句话说,我可以使用Vec3数据类型公开公共方法吗?

这是一个示例 Haxe 代码,其中一个类的公共函数使用该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:无法导入名称“glm_Vec3”

因为我能看到的唯一课程TestGLM1.py是:

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

它既有不友好的名称,也没有显示正确的构造函数。

有什么建议吗?谢谢。

4

1 回答 1

2

我可以在 TestGLM1.py 中看到的唯一类是 glm_Vec3Base

那是因为Vec3是一个abstract类型,而抽象只存在于编译时。底层类型确实是一个名为 的类Vec3Base,如果您检查一下,Vec3.hx您会注意到为什么它“没有适当的构造函数”:

class Vec3Base {
    function new() {}

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

您还可以注意到,所有Vec3的方法都被声明为inline. 如果不是(您可以通过编译来强制执行此操作--no-inline),您的 Python 输出将有一个名为glm__Vec3_Vec3_Impl_. 它对所有的方法都有静态方法Vec3,因为这就是抽象在幕后工作的方式:

在这一点上一个很好的问题是“如果成员函数没有被内联声明会发生什么”,因为代码显然必须去某个地方。Haxe 创建了一个私有类,称为实现类,它具有作为静态函数的所有抽象成员函数,接受this底层类型的附加第一个参数。

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

于 2018-02-08T11:00:54.060 回答