将参数传递给函数时如何使用 switch 语句? (镖)
How can I use a switch statement when passing an argument to a function? (dart)
在 Dart 中,可以使用 switch statements 而不是长 if-then-else
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
但有时我们只想提供一个基于条件的值。比如,在函数调用内部,class 实例化,或设置变量的值等。
例如
// Doesn't work, but wish it did
MakeNametag(
adjustFontSize: switch(status) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
} //end switch
}
);
如果只有两个选项,一个可以使用 conditional operator(有时称为三元运算符)
// Works
MakeNametag(
adjustFontSize: ['old','young'].contains(status) ? 'larger' : 'normal');
(javascript 具有相同的运算符和问题)
是的。我在研究语法时发现了它,我认为下面的方法看起来比大多数其他方法都好。可以链接三元运算符。
以下是在传递给函数的参数中使用“开关”思想的示例:
void main() {
int a=2;
print(
a==1 ? "s" :
a==2 ? "t" :
a==3 ? 'u' :
a==4 ? 'v' :
a==5 ? 'w' :
'x'
);
}
这就是上面的示例使用问题中的示例的样子。
MakeNametag(
adjustFont:
status=='young' ? 'large' :
status=='old' ? 'largest' :
status=='funky' ? 'wavy' :
status=='microsoft' ? 'timesNewRoman' :
status=='google' ? 'roboto' :
'normal',
}
);
还有许多其他方法可以做到这一点,例如创建 class 或使用 Map
对象并根据键查找值。但这是我所知道的最紧凑的方式。
PS。我写这篇文章是因为我发现很难找到如何称呼这种模式的答案。
在Dart中,switch
只是一个语句,不是表达式,所以不能作为参数使用,必须是表达式,并且有值。
你可以做的是定义一个辅助函数:
String fontSizeFromAge(String age) {
switch (age) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
}
}
MakeNametag(
adjustFontSize: nameTagFromAge(status)
);
或者,如果您坚持在使用值的地方设置开关,您可以在该点编写和调用函数:
MakeNametag(
adjustFontSize: () {
switch (status) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
}(),
);
(){ ... }()
语法是一个零参数函数文字 () { ... }
,它会立即用零参数 ... ()
调用。这是在 Dart 中将语句放入表达式的唯一真实方法。
通常情况下,您可以定义一个映射文字并立即将 []
下标添加到其中,而不是简单的 switch 语句。在 default
情况下使用 if null 运算符 ??
。
MakeNametag(adjustFont: {'young': 'large', 'old': 'largest'}[status] ?? 'normal');
通常您也可以制作地图文字 const
以提高性能。
MakeNametag(adjustFont: const {'young': 'large', 'old': 'largest'}[status] ?? 'normal');
在 Dart 中,可以使用 switch statements 而不是长 if-then-else
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
但有时我们只想提供一个基于条件的值。比如,在函数调用内部,class 实例化,或设置变量的值等。
例如
// Doesn't work, but wish it did
MakeNametag(
adjustFontSize: switch(status) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
} //end switch
}
);
如果只有两个选项,一个可以使用 conditional operator(有时称为三元运算符)
// Works
MakeNametag(
adjustFontSize: ['old','young'].contains(status) ? 'larger' : 'normal');
(javascript 具有相同的运算符和问题)
是的。我在研究语法时发现了它,我认为下面的方法看起来比大多数其他方法都好。可以链接三元运算符。
以下是在传递给函数的参数中使用“开关”思想的示例:
void main() {
int a=2;
print(
a==1 ? "s" :
a==2 ? "t" :
a==3 ? 'u' :
a==4 ? 'v' :
a==5 ? 'w' :
'x'
);
}
这就是上面的示例使用问题中的示例的样子。
MakeNametag(
adjustFont:
status=='young' ? 'large' :
status=='old' ? 'largest' :
status=='funky' ? 'wavy' :
status=='microsoft' ? 'timesNewRoman' :
status=='google' ? 'roboto' :
'normal',
}
);
还有许多其他方法可以做到这一点,例如创建 class 或使用 Map
对象并根据键查找值。但这是我所知道的最紧凑的方式。
PS。我写这篇文章是因为我发现很难找到如何称呼这种模式的答案。
在Dart中,switch
只是一个语句,不是表达式,所以不能作为参数使用,必须是表达式,并且有值。
你可以做的是定义一个辅助函数:
String fontSizeFromAge(String age) {
switch (age) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
}
}
MakeNametag(
adjustFontSize: nameTagFromAge(status)
);
或者,如果您坚持在使用值的地方设置开关,您可以在该点编写和调用函数:
MakeNametag(
adjustFontSize: () {
switch (status) {
case 'young' : return 'large';
case 'old' : return 'largest';
default: return 'normal';
}(),
);
(){ ... }()
语法是一个零参数函数文字 () { ... }
,它会立即用零参数 ... ()
调用。这是在 Dart 中将语句放入表达式的唯一真实方法。
通常情况下,您可以定义一个映射文字并立即将 []
下标添加到其中,而不是简单的 switch 语句。在 default
情况下使用 if null 运算符 ??
。
MakeNametag(adjustFont: {'young': 'large', 'old': 'largest'}[status] ?? 'normal');
通常您也可以制作地图文字 const
以提高性能。
MakeNametag(adjustFont: const {'young': 'large', 'old': 'largest'}[status] ?? 'normal');