Jintrick.netagenda2008年01月アーカイブ → 2008年01月29日

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