方法
类似于C语言的函数?
void print1(String a)
{
print("I'm $a.");
}
void print2(b)
{
print("I'm $b.");
}
void print3(String name) => print("I'm $name.");
void main()
{
print1("roadkiller");
print2("roadkiller");
print3("roadkiller");
}
方法对象
void main(){
var hello = printhello;//var 换成Function也没问题的
hello();//输出hello
}
void printhello()
{
print("hello");
}
void main()
{
var list = [1,2,3,4,5];
print(getList(list, multiply));//把列表每个元素求平方然后打印
}
List getList(List a,int b(int a))
{
for(int i=0;i<a.length;i++)
{
a[i]=b(a[i]);
}
return a;
}
int multiply(int n)
{
return n*n;
}
匿名方法
void main()
{
var func = (a){
return a*a;
};
print(func(30));//900
var list = [1,2,3,4,5];
powList(list, (int a){ return a*a; });
print(list);
}
List powList(List a,int b(int a))
{
for(int i=0;i<a.length;i++)
{
a[i]=b(a[i]);
}
return a;
}
还可以这样
void main()
{
var func = (a){
return a*a;
};
print(func(30));//900
var list = [1,2,3,4,5];
powList(list);
print(list);
}
List powList(List a)
{
var func = (int n){ return n*n; };//直接在方法里写匿名方法
for(int i=0;i<a.length;i++)
{
a[i]=func(a[i]);
}
return a;
}
可选参数
细心的朋友们会发现我省略了返回类型,对这就是简写,其实甚至可以参数都不用写类型的,不过小心混乱
void main(){
printperson("roadkiller");
printperson("roadkiller",age:18);
printperson("roadkiller",age:18,gender:"male");
printperson("roadkiller",gender: "male");
printperson2("roadkiller");
printperson2("roadkiller",18);
printperson2("roadkiller",18,"male");
}
printperson(String name,{int age,String gender})//命名参数
{
print("name = $name,age = $age,gender = $gender");
}
printperson2(String name,[int age,String gender])//位置参数
{
print("name = $name,age = $age,gender = $gender");
}
运行结果
默认参数值
使用 = 传给参数默认的值,如果不这样那么参数的值默认为null
默认值只能是编译期常量
void main(){
printperson("roadkiller");
printperson("roadkiller",age:18);
printperson("roadkiller",age:18,gender:"male");
}
printperson(String name,{int age = 18,String gender = "male"})
{
print("name = $name,age = $age,gender = $gender");
}
这样就没有null了,而且如果输入数据有某个参数,则会覆盖掉默认参数值
将函数作为参数传递给另一个函数
void main(){
List list = [1,2,3];
list.forEach(printEveryElement);
}
void printEveryElement(element){
print(element);
}
代码箭头式简写,只适用于return只有一个表达式
void main() {
print(loudify("roadkiller"));
}
String loudify(String info)
{
info = "!!!${info.toUpperCase()}!!!";
return info;
}
等价于
void main() {
var loudify = (info) => "!!! ${info.toUpperCase()} !!!";
print(loudify("roadkiller"));
}
闭包
闭包是一个方法,它定义在其他方法内部
闭包能访问外部方法内的局部变量,并持有其状态
void main(){
var func = count();
func();//0
func();//1
func();//2
func();//3
}
count(){
int cnt = 0;
printcnt(){
print(cnt++);
}
return printcnt;
}
void main(){
Function add2 = makeAdd(2);
Function add3 = makeAdd(3);
print(add2(3));
print(add3(5));
}
Function makeAdd(int plus_number)
{
return (int n) => n + plus_number;
}
运算符大部分和C语言差不多
说几个不一样的叭
1、有一个赋值运算符是 ?==
意思是如果未赋值则赋后面的值,如果已经赋值那么后面是无效的
int a;
a ?== 10;//a最后为10
int b = 5;
b ?== 10;//b最后为5
2、~/ 是除法取整,结果一定是整数
3、?? 运算符 若第一个是null那么赋第二个,否则赋第一个,例子如下
void main(){
int a;
int b=3;
int c = a??b;
print(c);//3
int d = 5;
int e = 10;
int f = d??e;
print(f);//5
}