Archives by date

You are browsing the site archives by date.

needle、haystack。

この英単語はPHPの公式リファレンスでよく見かける。

以前からどういう意味なんだろうと思いつつよく分からないまま放置していたが、調べてみると凄くしっくりきたのでメモ。

関数の引数部分にneedleとかhaystackとか書いてあって、いやどっちがどっちやねん。。。とか思ってたけど、非常に納得。

今後はわざわざ別ページに調べに行くこともなくなりそうである。

まず上記二つの英単語は「干し草」と「針」を意味している。

haystack = 干し草

needle = 針

もうこの時点であーなるほどって思ったけど、この単語が慣習的に用いられている理由は上記単語を用いた英語の慣用句にあるらしい。

 

needle in a haystack.
見つけることが不可能なもの。

look for a needle in a haystack.
望みのない捜し物をする、むだ骨を折る。

 

例えば文字列を検索する関数で、引数にhaystackとあれば、そこには検索対象文字列を渡し、needleには探したい文字列を渡せばいいわけである。

うん。とても理にかなっている。公式リファレンスに抵抗が無くなった瞬間であった。笑

Javascript、setTimeout()のthis問題。

直前の記事でsetTimeout()について触れたので、ついでにメモ。

下記ページより引用。
window.setTimeout – Web API リファレンス | MDN

 

setTimeout() によって実行されるコードは、setTimeout() が呼び出された関数とは別の実行コンテキスト内で実行されます。結果的に、呼び出された関数の this キーワードは window (または global) オブジェクトに設定され、setTimeout が呼び出された関数の this 値と同じにはなりません。この問題は JavaScript リファレンス でより詳細に説明されています。

 

とのこと。

一定間隔で定期実行したい処理などを記述する際、setTimeout()を用いると便利であるが、いつもの感覚でthisを使うと意図しない動作になるので注意されたし。

JavascriptのsetTimeout()は引数の渡し方に注意。

嵌ったのでメモ。

例えば下記のような関数が定義されていたとする。

var noname = function(arg1, arg2, arg3){
	console.log(arg1);
	console.log(arg2);
	console.log(arg3);
}

まずsetTimeoutで単純に関数を呼びたいだけの場合。
第1引数に関数名を指定する際、クオーテーションで括る方法と括らない方法があるので注意。

// 括る場合
setTimeout('noname()', 1000);
// 括らない場合
setTimeout(noname, 1000);

第1引数をクオーテーションで括った場合、関数名の後に括弧「()」が無いと正常に動作しない。
逆に括らなかった場合は括弧をつけてしまうと意図しない動作になる。

下記に示す記述方法はいずれも正常に動作しない例。

// 第2引数のms指定は無視され、即座に関数が呼び出される。
setTimeout(noname(), 1000);
// もはや動作しないパターン。
setTimeout('noname', 1000);

次にnoname()関数に変数を渡したい場合の記述方法。
この際もクオーテーションで括る場合と括らない場合で変数の渡し方に違いがあるので注意。

// 括る場合
setTimeout('noname("first", "second", "third")', 1000);
// 括らない場合
setTimeout(noname, 1000, 'first', 'second', 'third');
↓
[console]
first
second
third 

そして下記は例の如く正常に動作しない。

// 指定の間隔後に関数は呼び出されるが、変数は渡されない。
setTimeout('noname()', 1000, 'first', 'second', 'third');
// 変数は渡され実行もされるが、第2引数が無視されるので即座に呼び出されてしまう。
setTimeout(noname('first', 'second', 'third'), 1000);

見るページごとに書いてあることが違う気がするけど、全てちゃんと実験したので上記の情報は間違いないはず。
※問題児(IE)でもデバッグ済み。

PHPで三項目演算子を入れ子にする方法。

見易さ度外視孤高のワンライナーには必須の文法「三項目演算子」。
さらにこれを入れ子に出来ないかと調べてみたら簡単に出来たのでメモ。

まずはスタンダードな三項目演算子。

$needle = null;
$res = is_null($needle) ? 'null' : 'not null';
var_dump($res);
↓
string(4) "null"

たとえば上記式の評価後に更に条件を分岐させたい場合、参考演算子全体を括弧で括ればひとつの式として正常に評価されるので、入れ子に記述しても全く問題ないのである。

下記例。

$needle = '';
$res = is_null($needle) ? 'null' : (is_string($needle) ? 'string' : 'not string');
var_dump($res);
↓
string(6) "string"

これでワンライナーが更に捗る。