使用模式匹配的Dart可空记录:类型'(String,int)的匹配值?'不可分配给所需的类型'(Object?,Object?)'

gudnpqoy  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(100)

给定以下函数:

(String, int)? getPair() {
  return ('hello', 42);
}

字符串
我可以使用如下字段访问多个返回:

final pair = getPair();
if (pair != null) {
  String word = pair.$1;
  int number = pair.$2;
}


但是,我更喜欢使用某种模式匹配来解构这些值。这就是我所尝试的:

final (word, number) = getPair();


但这会导致以下错误:
类型'(String,int)的匹配值?'不可分配给所需的类型'(Object?,Object?)’。尝试更改模式的所需类型或匹配的值类型。
我该如何更改模式或匹配值的所需类型?
相关参考文献:

xpcnnkqh

xpcnnkqh1#

您可以对结果进行模式匹配并提取:

void main(List<String> arguments) {
  final (word, number) = switch (getPair()) {
    (String s, int i) => (s, i),
    final v => throw Exception('$v did not match'),
  };
  print('word is $word, number is $number');
}

(String, int)? getPair() {
  return ('hello', 42);
}

字符串
如果您需要有限范围的var,可以使用if-case:

void main(List<String> arguments) {
  if (getPair() case (final String word, final int number)) {
    print('word is $word, number is $number');
  }
}

(String, int)? getPair() {
  return ('hello', 42);
}

uyto3xhc

uyto3xhc2#

您可以在null-check之后进行解构,就像您手动使用$1$2一样:

final pair = getPair();
if (pair != null) {
  final (word, number) = pair;
  // ...
}

字符串
你可以使用not-nullassert 作为声明模式的一部分:

final ((word, number)!) = getPair();


如果值为null,则会抛出。
不能将nullcheck 作为声明的一部分,因为声明模式必须是不可反驳的,而检查可能会失败。
你可以使用?将null检查作为可反驳模式检查的一部分:

if (getPair() case (final word, final number)?) {
  // ...
} // else { "or else, if needed"; }


switch (getPair()) {
  case (final word, final number)?: // ....
  // default: "or else, if needed";
}


由于您还匹配以下解构中的类型,因此可以删除?
或者,如果您还希望绑定pair,则可以将这两种方法结合起来:

if (getPair() case final pair?) { // Bind `pair` if it's not `null`.
  final (word, number) = pair;
}

uklbhaso

uklbhaso3#

好吧,这比我想要的要详细一点,但这是一个部分解决方案:

final pair = getPair();
if (pair == null) return; // or throw/break/continue
final (word, number) = pair;

字符串
如果有更直接的方法,我欢迎另一个答案。

相关问题