CoffeeScriptは、引数を処理するときに名前付きにすることができますね。
func1 = (args) ->
console.log "#{args.msg} #{args.num}"
func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1, msg: 'hello') #-> "hello 1"
やってることは、結局 Hash になってるだけですが、関数呼び出しの時に CoffeeScript が空気読んでくれるから名前付きぽい呼び出し方に。
さらに、Hash の代入処理でも空気読むので…
func1 = (args) ->
{
msg
@num
} = args
console.log "#{msg} #{@num}"
func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1, msg: 'hello') #-> "hello 1"
なんてことも
これだと、引数に何が指定できるのか Hash だけどわかりやすい
必要なものを最初に全部書いておくようにすれば…だけど
ローカル変数も、インスタンス変数もできるし。便利。
(ただ、hash のキーは文字列なので、変数にできない文字列だと無理)
でもって、この次
それぞれの引数に初期値(デフォルト値)をつける。
func1 = (args={}) ->
{
msg
@num
} = {
msg: 'bye'
num: 2
}.$extend args
console.log "#{msg} #{@num}"
func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1) #-> "bye 1"
これには、tmlib.js の $extend メソッドを使ってるけど、いろんなフレームワークで、似たような機能ありますね。
Hash をマージするメソッド。
msg: 'bye'
num: 2
と、言う hash に args をマージするので、無ければ、デフォルト値として利用可能。
さらにさらに
tmlib.js には、AssetManager があるので…
func1 = (args='assset.name') ->
args = tm.asset.AssetManager.get(args) if typeof args == 'string'
{
msg
@num
} = {
msg: 'bye'
num: 2
}.$extend args
console.log "#{msg} #{@num}"
func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1) #-> "bye 1"
func1('hoehoe.asset') #-> hoehoe.asset の Asset オブジェクトで初期化
前に書いた、json ファイルの Asset化で、json Asset を指定するだけで、いろいろ引数のカスタマイズが可能に
その Asset のデフォルトもついでに用意
ASSETS =
'assset.name':
_type: 'json'
msg: 'bye'
num: 2
func1 = (args='assset.name') ->
args = tm.asset.AssetManager.get(args) if typeof args == 'string'
{
msg
@num
} = {}.$extend(ASSETS['assset.name']).$extend args
と言う感じにしてみました。面白い。
ASSETS を AssetManager でロードしておいても良いし、ロードしてなくても、デフォルト値はこれが利用される。
便利ぽい。
ただ、たまに引っかかるのが、Object.defineProperty で、setter が作成されてると @num とかに、代入したときに、もちろん setter が動く点。
もう、いろいろ大変。継承とかしてると、さらにどう動くのか…とか、たまに混乱の元。へふ~