Dart 是一种真正面向对象的语言,所以即便函数也是对象并且类型为 Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。你也可以像调用函数一样调用 Dart 类的实例。详情请查阅 可调用的类。
下面是定义一个函数的例子:
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
虽然高效 Dart 指南建议在公开的 API 上定义返回类型,不过即便不定义,该函数也依然有效(不推荐使用):
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
备忘📝:
1、语法 =>
表达式 是 { return 表达式; }
的简写, => 也称为箭头语法
2、在 =>
与 ;
之间的只能是 表达式 而非 语句。比如你不能将一个 if语句 放在其中,但是可以放置 条件表达式
3、=
和>
不能分开
一 、函数可以有两种形式的参数:必要参数
和 可选参数
。
- 必要参数定义在参数列表前面
- 可选参数则定义在必要参数后面。可选参数可以是
命名参数
或位置参数
。
1、可选参数
可选参数分为命名参数
和位置参数
,可在参数列表中任选其一使用,但两者不能同时出现在参数列表中。
a 命名参数
当你调用函数时,可以使用 参数名: 参数值 的形式来指定命名参数。例如:
enableFlags(bold: true, hidden: false);
定义函数时,使用{param1, param2, …}
来指定命名参数:
/// 设置 [bold] 和 [hidden] 标识……
/// Sets the [bold] and [hidden] flags...
void enableFlags({bool bold, bool hidden}) {...}
虽然命名参数是可选参数的一种类型,但是你仍然可以使用 @required 注解来标识一个命名参数是必须的参数,此时调用者则必须为该参数提供一个值。例如:
const Scrollbar({Key key, @required Widget child})
如果调用者想要通过 Scrollbar
的构造函数构造一个 Scrollbar
对象而不提供 child
参数,则会导致编译错误。
b 位置参数
使用[]
将一系列参数包裹起来作为位置参数:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
下面是不使用可选参数调用上述函数的示例:
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
下面是使用可选参数调用上述函数的示例:
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
c 默认参数值
可以用 =
为函数的命名和位置参数定义默认值。
备忘📝:
1、默认值必须为编译时常量
2、没有指定默认值的情况下默认值为 null
下面是设置可选参数默认值示例:
/// 设置 [bold] 和 [hidden] 标识……
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold 的值将为 true;而 hidden 将为 false。
enableFlags(bold: true);
Tips:在老版本的 Dart 代码中会使用冒号(:
)而不是 =
来设置命名参数的默认值。原因在于刚开始的时候命名参数只支持 :
。不过现在这个支持已经过时,所以现在还是 使用 =
来指定默认值。
List
或 Map
同样也可以作为默认值。下面的示例定义了一个名为 doStuff() 的函数,并为其名为 list 和 gifts 的参数指定了一个 List 类型的值和 Map 类型的值。(前面记得加const,才算编译时常量)
void doStuff(
{List<int> list = const [1, 2, 3],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}}) {
print('list: $list');
print('gifts: $gifts');
}
网友评论