8

在 Dart 中,我如何最好地编写(不可变/值/非对象)输出或引用参数的等效代码?

例如,在 C#-ish 中,我可能会编写代码:

function void example()
{
  int result = 0;
  if (tryFindResult(anObject, ref result))
    processResult(result);
  else
    processForNoResult();
}

function bool tryFindResult(Object obj, ref int result)
{
  if (obj.Contains("what I'm looking for"))
  {
    result = aValue;
    return true;
  }
  return false;  
}
4

2 回答 2

5

这在 Dart 中是不可能的。Dart 邮件列表中讨论了对结构值类型、ref 或 val 关键字的支持,就像 week 一样。这是一个讨论的链接,您应该在其中表达您的愿望:

https://groups.google.com/a/dartlang.org/d/topic/misc/iP5TiJMW1F8/discussion

飞镖方式将是:

void example() {
  List result = tryFindResult(anObject);
  if (result[0]) {
    processResult(result[1]);
  } else {
    processForNoResult();
  }
}

List tryFindResult(Object obj) {
  if (obj.contains("What I'm looking for")) {
    return [true, aValue];
  }
  return [false, null];
}
于 2012-08-22T21:30:50.163 回答
0

你也可以使用像 tuple-2.0.0 这样的元组包

将元组:^2.0.0 添加到您的 pubspec.yaml

那么任何函数都可以返回许多类型的对象,如下所示:

import 'package:tuple/tuple.dart';

Tuple3<int, String, bool?>? returnMany() {
return ok ? Tuple3(5, "OK", null) : null;
}




var str = returnMany().item2;

在你的情况下:

void example() {
  var result = tryFindResult(anObject);
  if (result.item1) {
    processResult(result.item2!);
  } else {
    processForNoResult();
  }
}

Tuple2<bool, int?> tryFindResult(Object obj) {
  if (obj.contains("What I'm looking for")) {
    return Tuple2(true, aValue);
  }
  return Tuple2(false, null);
}

当没有结果时,您也可以抛出异常。

void example() {
  var result = tryFindResult(anObject);
  try {
    processResult(result);
  } on NullException catch(e){
    processForNoResult();
  }
}

int tryFindResult(Object obj) { // throws NullException
  if (obj.contains("What I'm looking for")) {
    return aValue;
  }
  throw NullException();
}
于 2022-01-15T10:36:56.673 回答