ラベル クロージャ の投稿を表示しています。 すべての投稿を表示
ラベル クロージャ の投稿を表示しています。 すべての投稿を表示
2013/02/24

PHP5.3の無名関数がcreate_function関数より便利!

PHPで配列から特定の値を除去する関数を作っていたのだけど
create_functionに値を渡して判定してarray_filterで除去するのが良いかと思った。
が、create_functionに値を渡すことができなかった…!

参考
無名関数(クロージャ) « PHP6.jp
無名関数/クロージャ基礎 | PHPサンプル実験室
Tricorn Labs » PHP 5.3を使ってみました。の機能1. クロージャ(無名関数)

PHP: 無名関数 - Manualでも混同されているけど無名関数とクロージャは別物なので注意。

ということで作った関数がこちら。
function array_remove_all($array, $value){
    $callback = function($v) use($value){
        return $v !== $value;
    };
    return array_filter($array, $callback);
}
use を使うことで外からの変数を無名関数に渡すことができる。
array_filterでコールバック関数にcreate_functionを指定すると
変数と処理を文字列で記述しなくてはならなかったので IDEの支援なしで複雑なものを書くのは厳しかった。
せいぜい簡単なワンライナーで書ける処理だけだったので無名関数でPHPのコードとして書けるのは嬉しい。
今度から無名関数を使っていきたい。
2012/05/01

本当は(きっと)怖くないクロージャ

最近 iPhone アプリに挑戦していて、Objective-C とかいう一風変わった言語を勉強しています。
Appleワールドでしか生きられない言語のためによくわからない言語仕様をネットでちまちま調べてるほど暇じゃねーよと
最近は詳解 Objective-C 2.0 第3版を買ってセコセコと読んでいます。とても重いです。内容的にも重量的にも。

やっとブロックオブジェクトの章まで読み進めたら
Block は、「他のプログラミング言語ではクロージャ(closure)として知られている言語機能に相当」とか書かれていて、
( ´・∀・`)ヘーなんだークロージャのことかー全くこの言語は同じ事柄に対して別の名前がついてて大変だぜェー

で、クロージャ(closure)って何?

よく考えたらクロージャがなんなのか知りません。正直プログラミングClojureとゴッチャになってました。
わからないことはとりあえずググります。
クロージャ - Wikipedia
クロージャ(クロージャー、closure、閉包)はプログラミング言語における関数の一種。
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
本当にありがとうございました(?)

望みは絶たれたかと思ったがWikipediaの外部リンクにJavaScript 猿でもわかるクロージャ超入門という文字が!
僅かな望みをかけてリンクをクリック!Wikipediaのとどめの一撃に対して思うことに共感!
段階を踏んで一歩ずつ理解していけるのでオススメです。

とりあえずなんとなく、こういうこと↓だと理解しました。だいたいあってるらしいです。


えぇ、思い返せば関数の呼び出し回数を管理する変数を泣く泣くグローバル変数にして
気持ち悪いなーどうにかならないのかなーと思っていましたが、それを解決できるのがクロージャらしいです。
何か恐ろしいもののように仰々しく説明されるからよくわからなくて怖かったクロージャですが、
ホントは怖くなくて、身近な問題を解決できる便利なヤツでした。

浅い理解で間違ったことを書いているかもしれないので、タイトルはカッコ書きで…きっと(;´∀`)
なにか間違っていたら指摘してくださいね!

追記:どうやら上のツイートの用途だけじゃないみたいです。

タグ(RSS)