Function 从函数返回多个值

Function 从函数返回多个值,function,return,dart,Function,Return,Dart,有没有一种方法可以像在Go(或其他一些语言)中一样,在函数返回语句中返回多个值(而不是返回一个对象) 例如,在围棋中,我们可以做: func vals() (int, int) { return 3, 7 } 这可以用Dart完成吗?大概是这样的: int, String foo() { return 42, "foobar"; } Dart不支持多个返回值 您可以返回一个数组 List foo() { return [42, "foobar"]; } 或者,如果希望

有没有一种方法可以像在Go(或其他一些语言)中一样,在函数返回语句中返回多个值(而不是返回一个对象)

例如,在围棋中,我们可以做:

func vals() (int, int) {
    return 3, 7
}
这可以用Dart完成吗?大概是这样的:

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

Dart不支持多个返回值

您可以返回一个数组

List foo() {
  return [42, "foobar"];
}
或者,如果希望键入值,请使用软件包提供的
Tuple


有关返回值或错误的方法,请参见。

我想补充一点,Go中多个返回值的主要用例之一是错误处理,其中Dart句柄以自己的方式处理异常和失败的承诺

当然,这还剩下一些其他用例,所以让我们看看使用显式元组时代码的外观:

import'包:tuple/tuple.dart';
Tuple2演示(){
返回新的Tuple2(42,“生活是美好的”);
}
void main(){
最终结果=演示();
如果(结果项1>20){
打印(结果项2);
}
}
虽然没有那么简洁,但它的代码简洁而富有表现力。我最喜欢它的地方是,一旦你的快速实验项目真正启动,你开始添加功能,需要添加更多的结构以保持最新状态,它就不需要做太多改变

类格式化结果{
布尔变了;
字符串结果;
FormatResult(this.changed,this.result);
}
FormatResult powerFormatter(字符串文本){
bool-changed=false;
字符串结果=文本;
//秘密实现魔法
// ...
返回新的FormatResult(已更改,结果);
}
void main(){
字符串draftCode=“print('Hello World.');”;
最终重新格式化=powerFormatter(draftCode);
如果(已重新格式化。已更改){
//一些涉及云中服务器的昂贵操作。
}
}
因此,是的,它与Java相比并没有太大的改进,但它可以工作,很明显,并且对于构建UI来说相当有效。我真的很喜欢这样,我可以快速地把事情整合起来(有时在工作休息时从DartPad开始),然后在我知道项目将继续存在并发展时添加结构。

创建一个类:

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'],
    );
  }
}
导入“dart:core”;
类元组{
最终T1项目1;
最终T2项目2;
元组({
这是第1项,
这是第2项,
});
工厂元组.fromJson(映射json){
返回元组(
item1:json['item1'],
item2:json['item2'],
);
}
}
随便你怎么说

Tuple<double, double>(i1, i2);
or
Tuple<double, double>.fromJson(jsonData);
Tuple(i1,i2);
或
Tuple.fromJson(jsonData);

在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]);
  }
}
List func(){
返回[false,30,“Ashraful”];
}
void main(){
最终列表=func();
//访问特定列表项的步骤
var项目=列表[2];
//检查运行时类型
打印(item.runtimeType);
//要访问整个列表

对于(inti=0;i,您可以创建一个类来返回多个值 Ej:

生成值的函数:

 NewClass buildValues() {
        return NewClass(42, 'foobar');
      }
打印:

void printValues() {
    print('${this.buildValues().number} ${this.buildValues().text}');
    // 42 foobar
  }

我不知道是否有任何语言真的返回多个值。Python使用与您上面使用的相同语法,返回一个元组,它只是一个简单的对象。我怀疑Go类似。相关:Lua也可以返回多个值。
tuple
的+1与Go的内置功能最接近。它只是没有内置到Dart、pres中很可能还不太需要,他们让语言尽可能轻巧。还有其他优先事项。像这样的功能已经讨论了好几次。目前它是关于Dart 2.0的,具有强模式和通用函数,并且为2.0之后更快的迭代做了大量准备(统一前端、内核)。下一步希望是非空类型和其他。我不希望添加太多功能,但我完全信任Dart团队做出正确的决定。另外,Dart 2.0不兼容。将返回类型更改为
List
List
@zypro,以获得与Dart 2.0兼容的
实现,请参阅这个用例的函数式编程是+1,不需要重新发明轮子,让我们使用一个包,因为接下来有人想要一个3元素的元组,然后是元组3,依此类推。。。
void printValues() {
    print('${this.buildValues().number} ${this.buildValues().text}');
    // 42 foobar
  }