飞镖开关盒

时间:2014-06-15 11:47:47

标签: dart

我试图了解开关是如何工作的。我的代码非常简单:

methodname(num radians) {
  switch (radians) {
    case 0:
      // do something
      break;
    case PI:
      // do something else
      break;
  }
}

遗憾的是,这不起作用。如果保留为此错误是:case表达式必须具有相同的类型(我的类型是num,但不是编辑器)。 如果我将0更改为0.0,则表示:切换类型表达式double不能覆盖==运算符 - 我不知道这意味着什么!

那么切换案例的方法是什么?我可以将它转换为if / else,但我想知道如何使交换机工作,为什么它不能在第一时间工作。

我正在运行最新的DartEditor稳定版本。

请有人帮忙吗?

2 个答案:

答案 0 :(得分:6)

使用' =='对双值进行比较不是很可靠,应该避免(不仅在Dart中,而且在大多数语言中)。

您可以执行类似

的操作
methodname(num radians) {
  // you can adjust this values according to your accuracy requirements
  const myPI = 3142; 
  int r = (radians * 1000).round();

  switch (r) {
    case 0:
      // do something
      break;
    case myPI: 
      // do something else
      break;
  }
}

此问题包含您可能感兴趣的一些其他信息

更多信息:

答案 1 :(得分:5)

Dart 中的 Switch 语句使用 == 比较整数、字符串或编译时常量。被比较的对象必须都是同一个类(而不是其任何子类型)的实例,并且该类不能覆盖 ==。枚举类型在 switch 语句中运行良好。

通常,每个非空的 case 子句都以 break 语句结尾。结束非空 case 子句的其他有效方法是 continuethrowreturn 语句。

当没有 case 子句匹配时,使用 default 子句执行代码:

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}

以下示例省略了 break 子句中的 case 语句,从而产生错误:

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break

  case 'CLOSED':
    executeClosed();
    break;
}

然而,Dart 确实支持空的 case 子句,允许一种形式的失败:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

如果您真的想要失败,可以使用 continue 语句和标签:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

一个 case 子句可以有局部变量,这些变量只在该子句的作用域内可见。

引用自:https://dart.dev/guides/language/language-tour#switch-and-case