void main(List<String> args) {
/**
* Dart是一个真正面向对象的语言,
* 方法也是对象并且具有一种类型:Function。
* 这意味着,方法可以赋值给变量,也可以当做其他方法的参数,也可以当做其他方法的参数。
* 也可以把Dart类的实例当做方法来调用。
*
*/
// 定义方法的示例:
bool isDart(){
return true;
}
// 在公开的API推荐使用静态类型,也可以选择忽略类型定义:
isFlutter(){
return false;
}
// 对于只有一个表达式的方法,可以选择使用缩写语法来定义
// => expr 语法是 { return expr; }形式的缩写。 =>形式有时候也称之为 胖箭头 语法
// 注意:在箭头(=>)和冒号(;)之间只能使用一个 表达式,不能使用语句。例如:你不能使用if statement,
// 但是可以使用条件表达式 conditional expression
bool isTrue() => true;
/**
* 方法可以有两种类型的参数:必需的 和 可选的。必需的参数在参数列表前面,后面是可选参数。
*/
// Optional parameters (可选参数)
// 可选参数可以是命名参数或者基于位置的参数,但是这两种参数不能同时当做可选参数。
// Optional named parameters (可选命名参数)
// 调用方法的时候,你可以使用这种形式 paraName:value 来指定命名参数。例如:enableFlags(bold: true, hidden: false);
// 在定义方法的时候,使用 {oaram1,param2,...} 的形式来指定命名参数:
enableFlags({bool bold,bool hidden}){
}
// Optional positional parameters (可选位置参数)
// 把一些方法的参数放大 [] 中就变成可选位置参数了:
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');
// Default parameter values (默认参数)
// 在定义方法的时候,可以使用 = 来定义可选参数的默认值。默认值只能是编译时常量。
// 如果没有提供默认值,则默认值为null。
// 下面是设置可选参数默认值的示例:
void testOneFunction({bool bold = false, bool hidden = false}){
print(bold);
print(hidden);
}
// 版本问题:
// Dart SDK < 1.21 的版本代码使用一个冒号(:)而不是 = 来设置参数默认值。
// Dart SDK >= 1.21 的版本代码使用 = 来设置默认值。
// 下面的示例显示了如何设置位置参数的默认值:
String sayTestFunction(String from, String msg, [String device = 'carrier pigeon', String mood]){
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
assert(sayTestFunction('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');
// 还可以使用 list 或者 map 作为默认值。下面为示例:
void doStuff(
{
List<int> list = const [1, 2, 3],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}
}
){
list = [4, 5, 6];
print('list: $list');
print('gifts: $gifts');
}
// The main() function (入口函数)
// 每个应用都需要有个顶级的 main() 入口方法才能执行。main() 方法的返回值为 void 并且有个可选的 List<String>参数。
// Functions as first-class objects (一等方法对象)
// 可以把方法当做参数,调用另外一个方法,例如:
printElement(element){
print(element);
}
var list = ['哈哈哈', '滴滴滴', '哒哒哒'];
list.forEach(printElement);
// 方法也可以赋值给一个变量:
var loudify = (msg) => '${msg.toUpperCase()}';
assert(loudify('hello') == 'HELLO');
// Anonymous functions (匿名方法)
// 大部分方法都带有名字,例如 main() 或者 printElement()
// 也可以创建没有名字的方法,称之为 匿名方法。有时候也称之为 lambda 或者 closure 闭包。
// 可以把匿名方法赋值给一个变量,然后可以使用这个方法,比如添加到集合 或者 从集合中删除。
// 匿名函数和命名函数看起来类似,在括号之间可以定义一些参数,参数使用逗号分隔,也可以是可选参数。后面大括号中的代码为函数体。
// 下面的代码定义了一个参数为i(该参数没有指定类型)的匿名函数。list中的每个元素都会调用这个函数来打印出来
// 同时计算了每个元素在list中的索引位置:
var listOne = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
listOne.forEach((i){
print(listOne.indexOf(i).toString() + ': ' + i);
});
// 如果方法只包含一个语句,可以使用胖箭头语法缩写:
listOne.forEach((element) => print(listOne.indexOf(element).toString() + ': ' + element));
// Lexical scope (静态作用域)
// Dart 是静态作用域语言,变量的作用域在写代码的时候就确定过了。
// 基本上大括号里面定义的变量就只能在大括号里面访问。
// 下面是作用域的一个示例:
var topLevel = true;
void insideFunction(){
var inside = true;
void myFunction(){
var my = true;
void nestedFunction(){
var nested = true;
assert(topLevel);
assert(inside);
assert(my);
assert(nested);
}
}
}
// Lexical closures (词法闭包)
// 一个闭包是一个方法对象,不管该对象在何处被调用,该对象都可以访问其作用域内的变量。
// 方法可以封闭定义到其作用域内的变量。
// 下面示例中,makeAdder()捕获到了变量addBy。不管你在哪里执行 makeAdder() 所返回的函数,都可以使用 addBy 参数。
Function makeAdder(num addBy) { // 定义一个方法,返回一个方法对象
return (num i) => addBy + i;
}
var add2 = makeAdder(2); // 创建一个 加2 的方法对象(闭包)
var add4 = makeAdder(4); // 创建一个 加4 的方法对象(闭包)
assert(add2(3) == 5);
assert(add4(3) == 7);
}
// Testing functions for equality (测试函数是否相等)
// 下面是测试顶级方法、静态函数和实例函数 相等的示例:
void foo() {} // 顶级方法
class A {
static void bar() {} // 静态方法(类调用)
void baz() {} //示例方法(对象调用)
}
main(List<String> args) {
var x;
// 比较顶级方法
x = foo;
assert(foo == x); // 相等
// 比较静态方法
x = A.bar;
assert(A.bar == x); // 相等
// 比较实例方法
var v = new A();
var w = new A();
var y = w;
x = w.baz;
assert(y.baz == x); // 相等
assert(v.baz != w.baz); // 不是同一个对象,不相等
// Return values (返回值)
// 所有的函数都返回一个值。如果没有指定返回值,则默认把语句 return null; 作为函数的最后一个语句执行。
}
网友评论