我正在编写一个我将转换为Python和C#的课程。我的代码使用不错的" GLM"库。GLM提供了有用的数据类型,例如:Vec3
。
我可以让python和c#用户的Vec3
可见吗?换句话说,我可以使用Vec3
Datatypes公开公共方法?
这是一个示例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
既有一个不友好的名称又不显示合适的构造函数。
有建议吗?谢谢。
我在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生成的代码并不适合这样使用。这并不是说根本没有促进它的机制。例如,有用于JavaScript和LUA目标的@:expose
元数据。