Javascriptの特殊演算子inをPython風に利用する
Pythonでは、"foo"
, "bar"
, "baz"
の中に"foo"
があるかどうかを確かめるには"foo" in ("foo", "bar", "baz")
と書ける。in
を用いてJavascriptで同じようなことをしようとすると、"foo" in {"foo":null, "bar":null, "baz":null}
となって読みづらく、どうもシンタクスシュガーとしては冴えない。そこでTupleクラスを定義してみた。全く完全にシンタクスシュガーの為のクラスだ。
Tupleクラス
定義 |
function Tuple(){
for (let i=0; i<arguments.length; i++)
this[arguments[i]] = null;
}
|
---|
使用例 |
HTMLFormElement.prototype.getValue = function(name){
for each(let e in this.selectNodes("descendant::*[@name='" + name + "']"))
if (e.checked || e.selected || e.type in new Tuple("text", "file", "password"))
return e.value;
};
HTMLFormElement.prototype.getValue = function(name){
var locNamedComponents = "descendant::*[@name='"+name+"']";
var locOptionsInNamedSelect = "descendant::select[@name='"+name+"']/descendant::option";
for each(let e in this.selectNodes(locNamedComponents+" | "+locOptionsInNamedSelect))
if (e.checked || e.selected || e.type in new Tuple("text", "file", "password"))
return e.value;
};
|
---|
面倒くさいから今後もう書きたくもないけど、JavascriptといったらここではJavascript1.7のことをいう。
上の例は、フォーム要素(HTMLFormElement)にメソッドを追加している。あるname属性を持ったフォーム部品の有効な値を取ってくるというもの。フォーム部品には大きく分けて、その値が選択されるタイプ、入力されるタイプ、固定されているタイプに分けることができるが、特に選択されるタイプは、その値を参照する方法が他のタイプと異なっており、その差異を吸収しよう、と。そしてそれはPython的に考えれば1行で書けるはずだと予測するこの程度のスクリプトだが、Javascriptだと一ひねりしないと駄目だ、という話。
上の例ではノードリスト中のノード数だけnew Tuple
するのが無駄っぽいが、コードの読みやすさと簡潔性を優先した。どうせごみ収集されるし。
webmaster@jintrick.net
公開: 2008年01月29日
カテゴリ: Javascript