2019/12/19 Dart 関数(Functions)パート3

無名関数

main()関数やprintElement()関数のように、ほとんどの関数は関数名を持っていますが、名前のない関数を定義することもできます。無名関数はラムダ関数やクロージャーとも呼ばれることもあります。

無名関数の定義方法は通常の名前のある関数と似ています。0個、あるいは一つ以上の引数をカンマ(,)で区切り、型注釈を記述することもできますし、型注釈を記述しなくても問題ありません。

sample1-1

  var list = ['apples', 'bananas', 'oranges'];
  list.forEach((item) {
    print('${list.indexOf(item)}: $item');
  });
  
  list.forEach(
    (item) => print('${list.indexOf(item)}: $item')
  );
//0: apples
//1: bananas
//2: oranges
//0: apples
//1: bananas
//2: oranges

sample1-1では型注釈のない引数itemを取る無名関数を定義しています。無名関数はリストの各要素を受け取り、インデックス番号と文字列を表示します。

sample1-1の後半にあるように、関数の本体が一文の時アロー構文を用いて記述することができます。


レキシカルスコープ(静的スコープ)

Dartはレキシカルスコープ(静的スコープ)の言語です。

工事中🏗

参考

https://dart.dev/guides/language/language-tour#built-in-types

2018/12/30 php,無名関数、クロージャー、など パート2

次にクロージャについて。

クロージャとは、関数Aの宣言内で、関数Aの返り値として無名関数Bを返す。

そして外側関数Aを実行した返り値(無名関数)を変数に代入する。つまりラムダ関数。

クロージャは、変数の値として使用することもできます。 PHP は、そのような記述があると自動的に内部クラスClosure のインスタンスに変換します。

http://php.net/manual/ja/functions.anonymous.php

具体例として

https://qiita.com/tricogimmick/items/3e344486658e3cfbd407


function create_counter()
{
    $count = 0;
    return function() use (&$count) {
        return ++$count;
    };
}

$counter = create_counter();
echo $counter

2018/12/30 php,無名関数、クロージャー、など パート1

無名関数・クロージャーについてまとめる。

まず無名関数、ラムダ関数について。


$message = ‘testestテスト’;

$example=function($para){
var_dump($para);
};
$example($message);   //testtestテスト

$message=’worldworldワールド’;

$example($message);  //”worldworldワールド”


↑これも無名関数というんだと思う。





次にuseを使って外のスコープの変数(グローバル変数)を引き継ぐ方法(値渡し)


$message = ‘testてすと&テスト’;
$example = function () use ($message) {
var_dump($message);
};
$example();  //string(25) “testてすと&テスト”

$message = ‘worldわーるど&ワールド’;
$example();  //string(25) “testてすと&テスト”


↑ useを使ってグローバル変数を引き継いだ場合、無名関数を定義した時点での$messageの値を表示する。

その後$messageの値を’worldわーるど&ワールド’に変えても、$example()を実行した結果はstring(25) “testてすと&テスト”。…