Haxe(Flash)和内联化

4

我想询问一些关于Haxe(AS3)中内联的问题。

  1. 在编译过程中,任何标记有关键字 inline(静态和非静态)的方法总是会被内联吗?
  2. 属性默认是否会被内联?如果不会,有没有办法将它们内联化?(可能是通过分配内联存取器方法)
  3. 如果内联方法在编译时消失了,那么为什么还可以从它们中派生出函数对象?
1个回答

4

您是否看过haxe.org上的内联文档?

1.文档中有一些关于内联函数的限制。此外,您不能内联递归函数。我相信所有标记为inline的方法都将被内联(当然,如果您的hxml文件中没有--no-inline选项),如果某个具有inline标记的方法无法内联,则在编译期间将抛出错误。

2.不可以。您只能内联静态变量,否则会出现编译错误(内联变量必须是静态的)。请注意,已内联的变量显然无法更改,因此没有理由内联非静态变量。如果您内联geterseter

private var v: Bool;

public inline function getv(nv: Bool) {
    return v;
}

它将被视为:
private var v: Bool;

public inline function getv(nv: Bool) {
    return this.v;
}

在内联后,this将根据类的引用进行更改。请查看示例StopWatched类的任何属性都没有被内联。

  1. 我不确定我理解什么是函数对象。

我所指的内联访问器方法是这样的:public var x (getX, getY) : Int;,其中 getX()getY() 是内联方法。另外,functor 是一个函数对象,用于传递函数指针的一种方法,例如用于事件监听器。 - Acidic
1
酸性的,我并没有真正测试过结果,但我记得它们在某种程度上是内联的。当涉及到接口时,它们并不是这样,但这是相当明显的。 - Dykam
@Dykam 感谢回复。我知道内联方法无法被覆盖,但这不是我的问题的一部分。缺乏关于这些事情的文档让我相当烦恼。我的问题是 - 属性在底层是否真的是方法(就像在C#中一样),还是仅仅是编译器对字段访问的限制。(谈论普通属性,而不使用访问器方法。) - Acidic
1
@Acidic,属性定义只是一个别名。它会直接转换为方法调用。我认为在此之后,通常的函数属性适用。 - Dykam
@Dykam,由于您可以将访问器方法附加到属性或仅将其“原样”使用,因此这似乎并不明显。问题是,是否在不附加方法的情况下使用属性会在幕后生成方法(类似于C#中的自动属性),还是它只会像字段一样运行,但具有自定义可见性。 - Acidic
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接