有没有办法在函数return语句中返回多个值(除了返回一个对象),就像我们在Go(或其他一些语言)中一样?
例如,在Go中我们可以这样做:
func vals() (int, int) {
return 3, 7
}
这可以在Dart完成吗?像这样:
int, String foo() {
return 42, "foobar";
}
答案 0 :(得分:19)
Dart不支持多个返回值。
你可以返回一个数组,
List foo() {
return [42, "foobar"];
}
或者如果您希望键入值,请使用Tuple
类,例如https://pub.dartlang.org/packages/tuple包提供的内容。
另请参阅either
了解返回值或错误的方法。
答案 1 :(得分:2)
创建一个类:
import 'dart:core';
class Tuple<T1, T2> {
final T1 item1;
final T2 item2;
Tuple({
this.item1,
this.item2,
});
factory Tuple.fromJson(Map<String, dynamic> json) {
return Tuple(
item1: json['item1'],
item2: json['item2'],
);
}
}
随时随地呼叫它!
Tuple<double, double>(i1, i2);
or
Tuple<double, double>.fromJson(jsonData);
答案 2 :(得分:1)
我想补充一点,Go中多个返回值的主要用例之一是错误处理,Dart以自己的方式处理异常和失败的承诺。
当然这留下了一些其他用例,所以让我们看一下使用显式元组时代码的外观:
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开始)然后在我知道项目将继续存在并增长时添加结构。
答案 3 :(得分:0)
在Dart中这种情况下,一种简单的解决方案可以返回列表,然后根据您的要求访问返回的列表。您可以通过简单的for循环按索引或整个列表访问特定值。
List func() {
return [false, 30, "Ashraful"];
}
void main() {
final list = func();
// to access specific list item
var item = list[2];
// to check runtime type
print(item.runtimeType);
// to access the whole list
for(int i=0; i<list.length; i++) {
print(list[i]);
}
}
答案 4 :(得分:0)
你可以创建一个类来返回多个值 爱:
class NewClass {
final int number;
final String text;
NewClass(this.number, this.text);
}
生成值的函数:
NewClass buildValues() {
return NewClass(42, 'foobar');
}
打印:
void printValues() {
print('${this.buildValues().number} ${this.buildValues().text}');
// 42 foobar
}
答案 5 :(得分:0)
您可以使用 Set<Object>
返回多个值,
Set<object> foo() {
return {'my string',0}
}