dart 从函数返回多个值

yrwegjxp  于 2023-04-27  发布在  其他
关注(0)|答案(9)|浏览(208)

有没有一种方法可以在函数返回语句中返回多个值(而不是返回一个对象),就像我们在Go(或其他一些语言)中可以做的那样?
例如,在Go中我们可以做:

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

这可以在Dart中完成吗?类似于以下内容:

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

5anewei61#

Dart不支持多个返回值。
你可以返回一个数组

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

或者,如果你想输入值,可以使用Tuple类,就像https://pub.dartlang.org/packages/tuple包提供的那样。
另请参阅either,了解返回值或错误的方法。

z0qdvdin

z0qdvdin2#

我想补充的是,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),然后在我知道项目将继续存在并增长时添加结构。

vhipe2zx

vhipe2zx3#

创建一个类:

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);
relj7zay

relj7zay4#

你可以创建一个类来返回多个值Ej:

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
  }
pgpifvop

pgpifvop5#

返回多个值的正确方法是将这些值存储在一个类中,无论是您自己的自定义类还是Tuple。然而,为每个函数定义一个单独的类非常不方便,并且使用Tuple s可能容易出错,因为成员没有有意义的名称。
另一种方法(诚然很粗糙,也不太像Dart-istic)是试图模仿C和C++通常使用的输出参数方法。例如:

class OutputParameter<T> {
  T value;

  OutputParameter(this.value);
}

void foo(
  OutputParameter<int> intOut,
  OutputParameter<String>? optionalStringOut,
) {
  intOut.value = 42;
  optionalStringOut?.value = 'foobar';
}

void main() {
  var theInt = OutputParameter(0);
  var theString = OutputParameter('');
  foo(theInt, theString);
  print(theInt.value); // Prints: 42
  print(theString.value); // Prints: foobar
}

对于调用者来说,在任何地方都必须使用variable.value肯定会有点不方便,但在某些情况下,这可能是值得的。

wlp8pajw

wlp8pajw6#

Dart正在完成records,本质上是一个更奇特的元组。
应该是在一个稳定的释放与 dart 3。
它已经在experiments flags中可用。

mwkjh3gx

mwkjh3gx8#

你可以使用Set<Object>来返回多个值,

Set<object> foo() {
     return {'my string',0}
}

print(foo().first) //prints 'my string'

print(foo().last) //prints 0
zzlelutf

zzlelutf9#

在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]);
  }
}

相关问题