erlang の OO もどきの仕様(これっていつから?)
下記のコードのように、-module の二つ目の引数にリストを渡すと・・・
-module(new_test, [Test1, Test2, Test3]). -author('cooldaemon@gmail.com'). -export([get/1]). get(test1) -> Test1; get(test2) -> Test2; get(test3) -> Test3.
new/3 が定義され、get/1 の引数が一つ増えて、get/2 となる。
$ erl 1> new_test:module_info(). [{exports,[{new,3},{get,2},{module_info,0},{module_info,1}]}, {imports,[]}, {attributes,[{vsn,[82552267300809369358202831582896571762]}, {abstract,true}, {author,['cooldaemon@gmail.com']}]}, {compile,[{options,[]}, {version,"4.5"}, {time,{2008,5,2,7,56,34}}, {source,"/Users/cooldaemon/tmp/erl/new_test.erl"}]}]
これは、下記のように使える。
2> NewTestObj1 = new_test:new(foo, bar, baz). {new_test,foo,bar,baz} 3> NewTestObj1:get(test1). foo 4> NewTestObj1:get(test2). bar 5> NewTestObj2 = new_test:new(qux, quux, corge). {new_test,qux,quux,corge} 6> NewTestObj2:get(test3). corge
さらに、こんな事もできる。
7> {new_test, grault, garply, waldo}:get(test1). grault 8> new_test:get(test1, {new_test, fred, plugh, xyzzy}). fred
上記、mochiweb_request.erl を眺めていて知ったんですが、リファレンスマニュアルに載ってないですよね?
こう言う情報は、どこから仕入れるのが一番早いのだろうか・・・?
追記 (変数 THIS が使えた)
-module(new_test, [Test1, Test2, Test3]). -author('cooldaemon@gmail.com'). -export([get/1]). get(this) -> THIS; get(test) -> lists:map(fun (X) -> THIS:get(X) end, [test1, test2, test3]). get(test1) -> Test1; get(test2) -> Test2; get(test3) -> Test3.
1> NewTestObj = new_test:new(foo, bar, baz). {new_test,foo,bar,baz} 2> NewTestObj:get(this). {new_test,foo,bar,baz} 3> NewTestObj:get(test). [foo,bar,baz]