Dart(1)-変数、定数、基本型、演算子、条件付き判断、および型変換
Dart(2)-ループ式、リスト、セット、マップの一般的なプロパティとメソッド
メソッド定義
dart自定义方法的基本格式:
返回类型 方法名称(参数1,参数2,...){
方法体
return 返回值 / 或无返回值;
}
メソッドを定義するいくつかの例:
void printInfo(){
print('我是一个自定义方法');
}
int getNum(){
var count = 123;
return count;
}
String printUserInfo(){
return 'this is str';
}
List getList(){
return ['111','2222','333'];
}
Dartpublic
には 、private
などのキーワードはなく_
、下の横線はそれを直接表します private
。
メソッドスコープ
void main(){
void outFun(){
innerFun(){
print('aaa');
}
innerFun();
}
// innerFun(); 错误写法
outFun(); //调用方法
}
メソッドパラメータ
一般的な定義:
String getUserInfo(String username, int age) {
//形参
return "姓名:$username -> 年龄:$age";
}
print(printUserInfo('小明', 23)); //实参
Dartでは、オプションのパラメーターを使用してメソッドを定義できます。オプションのパラメーターでは、タイプのデフォルト値を指定する必要があります。
void main() {
String printUserInfo(String username, [int age = 0]) { //age格式表示可选
//形参
if (age != 0) {
return "姓名:$username -> 年龄:$age";
}
return "姓名:$username -> 年龄不详";
}
print(printUserInfo('小明', 28)); //实参
//可选就可以不传了
print(printUserInfo('李四'));
}
デフォルトのパラメーターを使用してメソッドを定義します。
String getUserInfo(String username,[String sex='男',int age=0]){ //形参
if(age!=0){
return "姓名:$username -> 性别:$sex -> 年龄:$age";
}
return "姓名:$username -> 性别:$sex -> 年龄不详";
}
print(getUserInfo('张三'));
print(getUserInfo('李四','男'));
print(getUserInfo('李梅梅','女',25));
名前付きパラメーターのメソッドを定義するには、名前付きパラメーターを定義するには、タイプのデフォルト値を指定する必要があります。
名前付きパラメーターの利点は、順番に割り当てなくても使用できることです。次のコードを参照してください。
String getUserInfo(String username, {int age = 0, String sex = '男'}) {//形参
if (age != 0) {
return "姓名:$username -> 性别:$sex -> 年龄:$age";
}
return "姓名:$username -> 性别:$sex -> 年龄保密";
}
print(getUserInfo('张三',sex: '男',age: 20));
メソッドをパラメーターとして受け取るメソッドを定義します。
実際、メソッドはパラメーターとして使用できます。これKotlin
は次と同じです。
//方法1 随便打印一下
fun1() {
print('fun1');
}
//方法2 参数是一个方法
fun2(fun) {
fun();
}
//调用fun2这个方法 把fun1这个方法当做参数传入
fun2(fun1());
矢印関数と関数呼び出しが相互に
矢印機能
forEach
前の研究では、トラバースに使用できることがわかっていList
ます。一般的な形式は次のとおりです。
List list = ['a', 'b', 'c'];
list.forEach((value) {
print(value);
});
矢印関数は次の形式に短縮できます。
list.forEach((value) => print(value));
矢印の後ろの矢印は、メソッドの戻り値を指しています。ここで、次の点に注意してください。
矢印関数で記述できるステートメントは1つだけであり、ステートメントの後にセミコロン(;)はありません。
map
矢印の方法を使用して、前の変換例を簡略化することもできます。
List list = [1, 3, 6, 8, 9];
var newList = list.map((value) {
if (value > 3) {
return value * 2;
}
return value;
});
内部のデータを変更するList
には、配列内の3より大きい値に2を掛けます。これは矢印関数で簡略化でき、次のように記述できます。
var newList = list.map((value) => value > 3 ? value*2 : value);
コード補完の一文、非常に興味深い。
関数の相互呼び出し
// 定义一个方法来判断一个数是否是偶数
bool isEvenNumber(int n) {
if (n % 2 == 0) {
return true;
}
return false;
}
// 定义一个方法打印1-n以内的所有偶数
prinEvenNumber(int n) {
for (var i = 1; i <= n; i++) {
if (isEvenNumber(i)) {
print(i);
}
}
}
prinEvenNumber(10);
匿名メソッド、自己実行メソッド、およびメソッドの再帰
匿名メソッド
var printNum = (){
print(12);
};
printNum();
ここKotlin
で、機能が基本的にと同じであることは明らかです。パラメータを使用した匿名メソッド:
var printNum = (int n) {
print(n + 2);
};
printNum(3);
自己実行方式
名前が示すように、自己実行関数の定義と呼び出しが統合されているため、自己実行メソッドを呼び出す必要はなく、自動的に実行されます。匿名関数を作成して実行すると、その内部変数は外部から参照できないため、実行後すぐに解放され、このアプローチによってグローバルオブジェクトが汚染されることはありません。次のコードを参照してください。
((int n) {
print("这是一个自执行方法 + $n");
})(666);
}
メソッドの再帰
メソッドの再帰は、条件が満たされているという条件の下でメソッド内で自分自身を呼び出し続けることに他なりません。次のコードを参照してください。
var sum = 0;
void fn(int n) {
sum += n;
if (n == 0) {
return;
}
fn(n - 1);
}
fn(100);
print(sum);
実装は1から100を追加することです。
閉鎖
クロージャーはフロントエンドの概念であり、クライアント開発の初期段階では、Java
クロージャーまたは不完全なクロージャーをサポートしていないと言えますKotlin
がクロージャーの操作はサポートできます。
クロージャとは、関数がネストされた関数であり、内部関数が外部関数の変数またはパラメーターを呼び出し、変数またはパラメーターがシステムによって再利用されないことを意味します(メモリは解放されません)。したがって、クロージャが解決する2つの問題は次のとおりです。
- 可変常駐メモリ
- 変数はグローバルを汚染しません
クロージャを作成する一般的な方法は次のとおりです。
- 関数は関数をネストし、内部に関数を返すため、クロージャを形成します。
クロージャーライティング:
Function func() {
var a = 1; /*不会污染全局 常驻内存*/
return () {
a++;
print(a);
};
}
ここでanonymousメソッドを返した後、aの値をメモリに常駐させることができます。
var mFun = func();
mFun();
mFun();
mFun();
印刷:2、3、4。