在ActionScript 3中提供原始强制转换

时间:2013-12-23 19:40:39

标签: actionscript-3 flash casting language-features coercion

在Java,C ++等语言中,有能力提供例如toInt()函数,以允许您的代码通过语言功能巧妙地转换为给定的基本类型。 (在此示例中,为Int。)

也就是说,如果您声明了标准转换函数myObject() toInt(),那么Int(myObject)之类的调用就可以了。这与你只是想完全忘记演员阵容并完成某些事情的情况更为相关 - someVar:Int = myObject + 3 ......对于一个任意的例子。

我搜索过AS3文档并在外面进行了一些搜索,但似乎在AS3中没有这样的功能,接口或其他类似的东西可以轻松访问。有谁知道这样的事情?它似乎是支持这种演员特征的任何语言的基本知识,而且我最终还是在数学工作中编写了一个像myObject.toInt()这样的部分限定名称的冗长。

1 个答案:

答案 0 :(得分:2)

这是一种常见的误解,即AS3中的运算符重载是不可能的。但事实并非如此,但它并不像其他语言那样有效。

AS3是“逐渐打字”的。这意味着您可以根据需要指定类型,您不需要,以及在两种不同类型上执行操作时,它将以合理的方式为您推断/投射。

对于对象,AS3提供valueOf():ObjecttoString():String功能,允许您定义自动处理转换。前者提供“对象的原始值”,而后者定义“对象的字符串表示”。

两者的默认值是字符串“[object ClassName]”,但您可以覆盖此默认值。这是一个例子:

package
{
  import flash.display.Sprite;
  import flash.utils.getQualifiedClassName;

  public class Main extends Sprite
  {
    public function Main():void
    {
      trace("-----------------------------");
      var foo = new MyClass();
      trace("foo is: ");
      trace(foo);
      trace("foo+foo is:");
      trace(foo+foo);
      trace("foo+foo+'--' is:");
      trace(foo+foo+"--");
      trace("'--'+foo+foo is:");
      trace("--"+foo+foo);
      trace("Math.PI/foo:");
      trace(Math.PI/foo);
      trace("'5'+foo is:");
      trace('5'+foo);
      trace("false || foo is:");
      trace((false || foo));
      trace("foo | 0xC is:");
      trace(foo | 0xC);
      trace("typeof(foo) is:");
      trace(typeof(foo));
      trace("getQualifiedClassName(foo) is:");
      trace(getQualifiedClassName(foo));
    }

  }
}

class MyClass {
  public function valueOf():Object { return 3; }
  public function toString():String { return "three"; }
}

跟踪输出为:

-----------------------------
foo is: 
three
foo+foo is:
6
foo+foo+'--' is:
6--
'--'+foo+foo is:
--threethree
Math.PI/foo:
1.0471975511965976
'5'+foo is:
5three
false || foo is:
three
foo | 0xC is:
15
typeof(foo) is:
object
getQualifiedClassName(foo) is:
Main.as$30::MyClass

布尔解释很有意思,但任何非null的Object(或String)都是正确的,所以实际上它可以解决。运行时调用valueOf()或toString()是否依赖于运算符的其他参数的类型。