您可以将命名参数与简写构造函数参数结合起来吗?
Posted
技术标签:
【中文标题】您可以将命名参数与简写构造函数参数结合起来吗?【英文标题】:Can you combine named parameter with short-hand constructor parameter? 【发布时间】:2014-03-10 08:51:22 【问题描述】:在飞镖中:
命名参数函数像这样-
String send(msg, rate: 'First Class')
return '$msg was sent via $rate';
// you can use named parameters if the argument is optional
send("I'm poor", rate:'4th class'); // == "I'm poor was sent via 4th class"
简写的构造函数参数函数是这样的-
class Person
String name;
// parameters prefixed by 'this.' will assign to
// instance variables automatically
Person(this.name);
有什么办法可以做类似下面的事情吗?-
class Person
String name;
String age;
Person(this.name = "defaultName", this.age = "defaultAge");
//So that I could do something like:
var personAlpha = new Person(name: "Jordan");
谢谢,
从dartlang synonyms借来的代码示例
【问题讨论】:
【参考方案1】:更新
是的,=
在 Dart 2 中是允许的,现在比 :
更可取,以匹配可选的位置参数。
Person(this.name = "defaultName", this.age = "defaultAge");
旧答案
你只需要使用冒号而不是等号
class Person
String name;
String age;
Person(this.name: "defaultName", this.age: "defaultAge");
我发现这仍然令人困惑,可选参数使用=
分配默认值,但命名使用:
。
应该问问自己。
【讨论】:
这个语法的论据是它“看起来像” Map 文字语法。 现在=
显然被允许(首选?)代替冒号。
@Suragch 谢谢!是的 =
是为 Dart 2 添加的,现在它比 :
更适合匹配可选的位置参数。【参考方案2】:
您可以使用“这个”。具有所有参数类型的语法。 如上所述,您需要 ':' 作为命名参数的默认值。
你甚至可以使用“这个”。对于函数类型参数:
class C
Function bar;
C(int this.bar(int x) : foo);
static foo(int x) => x + 1;
【讨论】:
这也太棒了。谢谢伊恩!酒吧怎么可能是可选的呢? bar 和 foo 都有 x 的必需参数;所以,如果你只是不包含 bar 作为参数,那么 foo 怎么知道 x 是什么? 在这种情况下,“bar”只是一个标准的可选参数,它需要一个值。该值必须具有函数类型(int->int),但在其他方面与编写C(String this.bar: 'bif')
没有区别。如果参数被省略,它将使用默认值,否则它将使用传递的任何参数。您可以将其称为new C(bar:null)
或new C(bar: (z) => -z)
。【参考方案3】:
您还可以添加必填字段以跳过默认初始化,如下所示:
class ProcessArguments
final String logoImagePath;
final String textLogoImagePath;
ProcessArguments(required this.logoImagePath, required this.textLogoImagePath);
【讨论】:
以上是关于您可以将命名参数与简写构造函数参数结合起来吗?的主要内容,如果未能解决你的问题,请参考以下文章