【问题标题】:Providing primitive casts in ActionScript 3在 ActionScript 3 中提供原始类型转换
【发布时间】:2013-12-23 19:40:38
【问题描述】:

在 Java、C++ 等语言中,可以提供例如toInt() 函数,以允许您的代码通过语言特性巧妙地转换为给定的原始类型。 (在本例中,Int。)

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

我已经搜索了 AS3 文档并在此之外进行了一些搜索,但似乎在 AS3 中没有这样的函数集、接口或其他易于访问的东西。有谁知道这样的事情?在任何支持这种转换功能的语言中,这似乎都是必不可少的知识,而我在数学工作中写出像myObject.toInt() 这样的部分限定名称,我已经束手无策了。

【问题讨论】:

  • 只是如果你有一个自定义类,AS 无法明确知道如何将其转换为任何其他原始类型。
  • 那篇文章比什么都没有用。它所说的是同一继承树中的事物具有某种相互转换的能力(如果我不得不猜测的话,也可能是强制的)并且原语可以相互转换。虽然这具有一定的相关性,但最好 - 例如 - 制作一个复杂的颜色代表类,该类可以被巧妙地强制转换为计算媒体的数字。 (只是一个现成的例子。)

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


【解决方案1】:

一个常见的误解是,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

布尔解释很有趣,但任何非空对象(或字符串)都是真的,所以实际上它是可行的。运行时调用 valueOf() 还是 toString() 似乎取决于运算符的其他参数的类型。

【讨论】:

  • 我不知道为什么我不相信他们把它放在一般层次结构的最高级别,Object 类。作为补充,可以找到默认函数定义的相关文档here
  • 感谢您提醒我,我在答案中添加了文档链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2011-10-06
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多