Dart'查询'显式演员

时间:2013-04-07 14:32:48

标签: dart

请考虑以下代码:

ButtonElement btnSend = (ButtonElement) query('#btnSendToServer');

我收到内部错误:

Internal error: 'http://127.0.0.1:3030/home/Seth.Ladd/Projects/DartSimpleChat/SimpleChatClient/web/out/simplechatclient.dart': Error: line 30 pos 43: semicolon expected

ButtonElement btnSend = (ButtonElement) query('#btnSendToServer');
                                        ^

所以问题是:

  • 这是做正确演员的正确方法吗?
  • query是否支持显式/隐式演员?
  • 我是否应该担心从query返回的对象,或者我可以盲目地相信该对象将被归还ButtonElement
  • 是否有查询仅搜索ButtonElements

1 个答案:

答案 0 :(得分:7)

Dart是一种动态类型语言。即使你把类型扔到各处,它仍然是动态的。所以考虑到这一点,通常在你投射它时意味着你要确定这个东西是特定类型的。

在您的情况下,您希望确定它是ButtonElement。 您可以使用isas运算符进行类型测试:

// You can write code to test the type yourself:
if (btnSend is! ButtonElement) throw 'Not a button';

// Or you can use "as" that will throw if the type is wrong:
var btnSend = query('#btnSendToServer') as ButtonElement;

根据具体情况,我使用isas。通常我不使用as,因为它有(小?)性能开销。

您可以采取另一种方法,我个人更喜欢这种方法。写下你的代码:

ButtonElement btnSend = query('#btnSendToServer');

当您正在开发时,请以检查模式运行:

dart --checked foo.dart

或者当您使用Dartium时,read about launching Dartium manually with flags。我暂时没有使用Dart编辑器,所以我不确定它是否默认使用了检查模式,如果你可以改变它。

在检查模式下运行时,如果类型不匹配,将向btnSend分配。关于这一点的好处是,当您在没有选中模式的情况下在生产环境中运行代码时,您的应用程序将不会受到任何性能开销的影响。

回答一些问题:

query是否支持显式/隐式转换?

没有。它只是一个随意的函数,不关心类型。

是否有查询仅搜索ButtonElement

你可以这样写:

query('button#btnSendToServer')

这是一个典型的CSS选择器,而不是Dart的东西。

我是否应该担心从查询中返回的对象,或者我可以盲目地相信该对象将被返回ButtonElement

是和否。我相信如果对象不是ButtonElement,它最终会在某个时刻抛出你的应用程序,但我会建议你在开发和编写时以检查模式运行:

ButtonElement btnSend = query('#btnSendToServer');

由您来决定要输入多少类型信息。如果您认为该按钮很容易出错类型,那么我认为指定类型是有意义的。就个人而言,我不会对类型感到疯狂,只有我觉得它们才有意义。