LoginSignup
8
8

More than 5 years have passed since last update.

tmlib.js + CoffeeScript での引数の処理の妙

Posted at

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 が動く点。
もう、いろいろ大変。継承とかしてると、さらにどう動くのか…とか、たまに混乱の元。へふ~

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8