Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2013年01月

関数、より細かく言うなら関数クロージャー(function closure)は、クラスやオブジェクトに関わりなく一定の仕事を実行する個別の命令のことである。関数クロージャーはインスタンスメソッド及び静的メソッドと同様の文法を持っている。

・functionキーワードによって定義する
・ローカル変数を定義できる
・カッコ演算子によって呼ぶ
・値を返すことができる

しかし、オブジェクトと常に結びついているインスタンスメソッドや、クラスと常に結びついている静的メソッドと異なり、関数クロージャーはメソッドの付随的な仕事やパッケージ全体・プログラム全体で利用可能な汎用ユーティリティとして作られる。


ActionScript 3.0の厳密な技術用語としては、関数クロージャーとメソッドは関数の種類である。function(関数)という用語は一般に、呼び出し可能な命令のオブジェクトのことをいう。したがって、関数クロージャーはオブジェクト又はクラスと結びついていない関数のことであり、メソッドはオブジェクトと結びついている関数のことである。もっとも、ふつうの議論や文書では、関数クロージャー(function closure)は関数(function)と縮めて用いられる。ActionScript3の仕様書を読んでいるのでもない限り、関数とは関数クロージャーのことであると想定して差し支えない。


関数を作るには、次のように書く。

function identifier (param1, param2, ...paramn) {
}

書き方はインスタンスメソッド定義と同じである。

関数を呼ぶには、次のように書く。

functionName(value1, value2, ...valuen)


今日の進捗:195→196/1644

2013-03-13 追記

一応解決しました→ターミナルから「subl」コマンドでSublimeText2を起動する



未解決だけどメモだけ。

Sublime Text 2には組み込みのコマンドラインツールが用意されているのだけど、MacPortsでpythonをインストールしていると(?)コマンドラインツールが上手く動かない模様。

If you have the MacPorts version of Python installed, then starting Sublime Text 2 via the subl will not work correctly. As a workaround, start Sublime Text 2 first via Finder, and then interact with it using subl.

http://www.sublimetext.com/docs/2/osx_command_line.html
今使ってるMacOS Xにはpythonは確かに入っているのだけど、MacPortsでインストールしたわけではない(port installedの一覧にpythonは無い)。にもかかわらずSublime Text 2のコマンドラインツールが「subl」コマンドで使用できない。原因不明につきスタブ。

最近話題のテキストエディタSublime Text 2、去年の夏、MacBook Airを買ってすぐの頃、エディタを色々放浪していた時期に試しました。が、良さがイマイチ分からず、CotEditorに落ち着いた記憶があります。

その後記憶の彼方に追いやられていましたが、最近になってSublime Text 2を使う機会がありました。使用環境は、自分のMacBook Airではなく、会社のWindows PCです。

このWinodows PC、PhpStorm等で数千行もあるPHPファイルを編集すると、一箇所変更するごとに一瞬固まります。これがストレスになって、代替となるエディターを探していたところ、Sublime Text 2が候補に上がりました。

Sublime Text 2、見た目のイメージからMac専用と思ってましたが、Mac/Windows/Linuxに対応した万能選手です。現在、私が気に入っているポイントを挙げておきます。

  • フォントが綺麗。Windows環境で日本語フォントの表示が残念なエディタも散見されるが(e.g. PhpStorm)、Sublime Text 2は何も設定しなくてもフォントが綺麗。
  • シンタックスハイライト。デフォルトでPHPが入っているので設定不要。ActionScriptも入っているのが嬉しい。
  • コード補完。IDEほど賢くはないけれど、それなりに使える。また、"や(){}等の記号の補完もしてくれる。インデントも賢い。
  • zen-codingを標準装備。HTMLファイルで「html」と入力した後にtabキーを押すと、html文書の基本要素が展開される。もっとも、デフォルトではフル装備ではない模様で、「html:5」やCSSの展開はしてくれない。(拡張機能をインストールすれば可能と思われる)
  • ↑で紹介した「html」+ tabキーでのコード展開は、コード補完によるものだった。zen-coding(現在はemmetという名前で新プロジェクトになっている)は、拡張機能でインストールできる。

一方、IDEと比較した欠点として、コードのエラー発見等はやってくれないので、編集時に凡ミスが増えます。本来であれば、巨大なコードの編集にこそ、IDEを使いたいところなのですが…。ともあれ、Windows PCでのPHPの編集、しばらくの間はSublime Text 2でいってみようと思います。

Sublime Text 2の使い方に関しては、ドットインストールのレッスンがオススメ。設定の変更からパッケージ管理まで解説されてます。

インスタンス変数、インスタンスメソッド、静的変数、静的メソッドの概念は、ほとんどのオブジェクト指向言語に存在する。以下は、ActionScript/Java/C++のそれぞれにおける用語の表。

ActionScript Java C++
インスタンス変数 フィールド あるいは インスタンス変数 データメンバー
インスタンスメソッド メソッド メンバー関数
静的変数 クラス変数 静的データメンバー
静的メソッド クラスメソッド 静的メンバー関数

PHPのarray_splice()関数は、配列操作関数の万能選手。単独で様々な操作が可能です。しかし反面、オプションが多くて挙動が分かりにくい。そこで、基本事項を整理しておきます。


まずは引数と戻り値について。
array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
$inputを参照渡しして、$offsetの位置をスタート地点とし、$lengthぶん進んだ位置までを切り取ります。置換対象の指定があれば、切り取った後で置換対象を挿入します。array_splice()は切り取られた配列を返します。


次に、最もシンプルな使い方。
$data = range(1, 9); // 1から9までを含む配列を生成
array_splice($data, 2);
print_r($data);
// Array ( [0] => 1 [1] => 2 )
$dataの中で、最初(0)から指定オフセット(この場合は2)のぶんだけ進んだ位置(2)までをスタート地点とします。$lengthの指定が無い場合、最後まで切り取ります。

$lengthを指定してみると、
$data = range(1, 9);
print_r(array_splice($data, 2, 3));
// Array ( [0] => 3 [1] => 4 [2] => 5 )
print_r($data);
// Array ( [0] => 1 [1] => 2 [2] => 6 [3] => 7 [4] => 8 [5] => 9 )
インデックス2の地点([2] => 3)から3つ切り取っています。

置換も試してみる。
$data = range(1, 9);
$replacement  = array('a', 'b', 'c');
print_r(array_splice($data, 2, 6, $replacement));
print_r($data);
// Array ( [0] => 1 [1] => 2 [2] => a [3] => b [4] => c [5] => 9 )
今度は$lengthに6を指定しているので、インデックス2の地点からスタートして、6個要素を切り取り、インデックス2の地点から置換対象の配列を挿入しています。


次に、$offsetに負の数(-5)を指定してみます。
$data = range(1, 9);
array_splice($data, -5);
print_r($data);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
今度は、配列の最後の地点([8] => 9)から数えて5つ要素を切り取っています。

ここで、$lengthを指定してみると…
$data = range(1, 9);
print_r(array_splice($data, -5, 3));
// Array ( [0] => 5 [1] => 6 [2] => 7 )
print_r($data);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 8 [5] => 9 )
最後の地点から数えて5つ目([4] => 5)からスタートし、後ろに向かって3つぶん要素を切り取っています。では、$lengthに負の数を指定すると…
$data = range(1, 9);
print_r(array_splice($data, -5, -3));
// Array ( [0] => 5 [1] => 6 )
print_r($data);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 9 )
$lengthに負の数を指定した場合は、[4] => 5から前に向かって3つぶん… ではなく、配列の後ろから、|$length|(絶対値)ぶんを残して切り取ります。この場合は-3を指定しているので、配列の後ろから数えて、|-3| = 3つぶん残しています。-2なら最後の2つ、-1なら最後の1つだけが残ります。

$offsetに正の数、$lengthに負の数、というパターンも試しておきます。
$data = range(1, 9);
print_r(array_splice($data, 1, -4));
// Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 )
print_r($data);
// Array ( [0] => 1 [1] => 6 [2] => 7 [3] => 8 [4] => 9 )
インデックス1の地点(1 => 2)を開始地点として、配列の後ろから|-4| = 4つ要素を残しているのが分かります。


理解に時間がかかったのは、$lengthが負の数であるパターンですね。このように、ちょっと関数の挙動を調べたい、っていう状況では、ローカルでもいいですが、インターネット環境があるならllevalがオススメです。利点は、出力が見やすいことと、テスト用のファイルを作らなくても良いところ。

このページのトップヘ