2017-07-26 117 views
4

有沒有辦法在函數的返回語句返回幾個值(並非返回一個對象),就像我們可以在去做(或其他語種)飛鏢 - 函數返回多個值

例如,讓我們一起來基本的例子

在走,我們做

func vals() (int, int) { 
    return 3, 7 
} 

我們能做到這一點在DART(有一些像這樣的東西)

int, String foo() { 
    return 42, "foobar"; 
} 

將真棒,但我無法找到互聯網

感謝上合適的解決方案,阿列克謝

+0

我不知道任何語言是否真的返回多個值。 Python使用與上面相同的語法,它返回一個元組,它只是一個簡單的對象。我懷疑Go是相似的。 – Carcigenicate

+0

相關:https://groups.google.com/a/dartlang.org/forum/m/#!topic/misc/j-1I--HjXag – Carcigenicate

回答

8

鏢不支持多個返回值。

你可以返回一個數組,

List foo() { 
    return [42, "foobar"]; 
} 

,或者如果你想要的值鍵入使用Tuple類像包https://pub.dartlang.org/packages/tuple提供。請參閱either以獲取返回值或錯誤的方法。

+0

用於'tuple'的+1,它與Go的關係最爲密切其內置。它只是沒有內置到Dart中,據推測還沒有太多需要,他們保持語言儘可能輕。 –

+0

還有其他優先事項。像這樣的功能已經被多次討論過了。目前它是關於Dart 2.0的強大模式和泛型功能以及爲2.0之後的更快迭代做準備(統一的前端,內核)。接下來希望不可爲空的類型和其他類型。我更喜歡不添加太多功能,但我完全信任Dart團隊做出正確的決定。 –

0

我想補充一點,Go中多個返回值的主要用例之一是錯誤處理,Dart處理以自己的方式處理Exceptions和失敗的promise。

當然,這留下了一些其他使用案例,讓我們看看使用明確的元組時,代碼的外觀:

import 'package:tuple/tuple.dart'; 

Tuple2<int, String> demo() { 
    return new Tuple2(42, "life is good"); 
} 

void main() { 
    final result = demo(); 
    if (result.item1 > 20) { 
    print(result.item2); 
    } 
} 

不太簡明,但它的清潔和表現力的代碼。我最喜歡的是,一旦你的快速實驗項目真正開始,並且你開始添加功能並且需要添加更多的結構來保持事物的頂部,它不需要改變很多。

class FormatResult { 
    bool changed; 
    String result; 
    FormatResult(this.changed, this.result); 
} 

FormatResult powerFormatter(String text) { 
    bool changed = false; 
    String result = text; 
    // secret implementation magic 
    // ... 
    return new FormatResult(changed, result); 
} 

void main() { 
    String draftCode = "print('Hello World.');"; 
    final reformatted = powerFormatter(draftCode); 
    if (reformatted.changed) { 
    // some expensive operation involving servers in the cloud. 
    } 
} 

所以,它對Java沒有太大的改進,但它的工作原理很清楚,並且對於構建UI來說是非常有效的。我真的很喜歡我可以快速將事情整合在一起(有時在工作中休息時從DartPad開始),然後在知道該項目將繼續並發展時添加結構。

+0

該用例的函數式編程的一個常見模式是https://pub.dartlang.org/packages/either –