Dart中使用“=>”的单行函数

时间:2013-06-08 18:18:02

标签: dart

我喜欢Dart的很多事情之一就是缺乏冗长。

例如,单行函数如下:

  // example 1
String toStr() => (_iValue/_iScale).toStringAsFixed(_iDecimals);

然而,它似乎提出了一个问题,即是否存在不返回值的单行函数的等价物。例如

// example 2
void deductDbl(double dValue) {
  _iValue -= (dValue * _iScale).toInt();
}

虽然可以用一行中的“{和}”表示,但这可能不赞成。类似的类比也许是单行“if语句”,其中不需要括号。我认为大多数人将其格式化为两行,因为它更好地说明了逻辑。但是,它仍然比使用“{}”更简洁,尽管如果有人愿意,仍然可以选择使用“{}”。

作为示例2的替代方案,我注意到以下内容似乎有效,但由于某种原因可能不赞成:

   // example 3
deductDbl(double dValue) => _iValue -= (dValue * _iScale).toInt();

使用“示例3”是否可以接受,或者对于不返回值的单行函数是否还有另一个“=>”等效项?

3 个答案:

答案 0 :(得分:3)

我的建议是,您不应该尝试将=>简写形式用于应该返回类型为void的函数。你的第三个例子,

deductDbl(double dValue) => _iValue -= (dValue * _iScale).toInt();

实际上会返回int。说实话,这和

之间的区别
deductDbl(double dValue) { _iValue -= (dValue * _iScale).toInt(); }

一个空白字符。 真的那么糟糕吗?

答案 1 :(得分:2)

这是一个品味问题,所以我的建议是做任何合理的事情。

我没有看到以速记形式编写无效功能的任何问题,而且我经常这样做,但如果你不知道自己在做什么,它会咬你。

您的示例3并不像您认为的那样行事。它不等同于示例2,因为在示例3中,deductDbl返回int

之间有区别:

deductDbl1(double dValue) { _iValue -= (dValue * 1).toInt(); } // returns null 

deductDbl2(double dValue) => _iValue -= (dValue * 1).toInt(); // returns int

原因是表达式_iValue -= something的结果为_iValue,因此返回类型为int

这给出了:

var r1 = deductDbl1(x);  // r1 is null!
var r2 = deductDbl2(x);  // r2 is an int equal to _iValue!

答案 2 :(得分:1)

  

使用“示例3”是否可以接受,或者对于不返回值的单行函数是否还有另一个“=>”等效项?

没有没有返回值的等价物,但我会说使用该表格是完全可以接受的。请记住,如果您为该方法添加了一个类型,它应该是int,而不是void或其他任何内容,因为它就是它返回的内容。