CoffeeScriptの書き方いろいろ

とりあえずちょっとした時間で思いついた分です。

お好みに合うかどうかは別として...

可変長引数呼び出し

# funcを呼び出したら、anotherFuncを引数そのままの状態で呼び出す
func = (args...) -> anotherFunc args...

コストが気になるなら最後にreturnを置きましょう

func = (list) ->
    # 最後にリストを作ってしまうのがいやなら...
    e.hoge() for e in list

betterFunc = (list) ->
    e.hoge() for e in list
    # こうすればいい
    return

いないプロトタイプだーれだ?

# 厳密には行儀悪いかも
Function::bind ?= (context, baseArgs...) -> (args...) => @call context, baseArgs..., args...

配列のコピー

ary = [1..100]
copied_array = [ary...]

値交換

[a, b] = [b, a]

変数名省略

{ hoge, fuga } = obj # { hoge : hoge, fuga : fuga } = obj
func {hoge, fuga} # func { hoge : hoge, fuga : fuga }

リストに混ぜて引数にして呼び出し

a = 1
b = [1..10]
c = 2
d = [3..10]

# console.log(1, 1, 2, 3, 4, .., 10, 2, 3, 4, .., 10)
console.log a,b..., c, d... 
console.log a,[b..., c, d...]...

お好きなだけ分配してください

[a, b..., c] = [d..., e, f..., g...]
[[a, alpha], b..., c, {hoge, fuga}, { foo : bar, baz : boo}] = [d..., e, f..., g...]

足りないとどうなるんだろう?

lack = ([head, body..., tail]) -> console.log head, body, tail

lack [1, 2, 3] # prints '1 [ 2 ] 3'
lack [1, 2]    # prints '1 [] 2'
lack [1]       # prints '1 [] undefined'
lack []        # prints 'undefined [] undefined''

仮引数でも分配できるよ

func = ([first, mid..., last]) -> first + last
console.log func [1..10] # prints '11'

func = ({a, b}) = a + b
console.log func a : 1, b : 2 # prints '3'

# 文法としては成立するようです
func = ({length}...) -> length # 下記コードとあわせると[3,2,1].lengthを返す
console.log func 3,2,1 # prints '3'
# だからこれもアリ
func = ({0 : one, 1 : two, 2 : three}...) -> one * two * three
console.log func 1,2,3 # prints '6'

グローバル関数の定義

@globalFunction = (x) -> x * x

# スコープを分けたい場合は do => で
do =>
  scopedVariable = [1..4]
  @anotherGlobalFunction = -> console.log(scopedVariable)

関数を気軽に飾りましょう

$this = (fn) -> (args...) -> fn.call $(@), args...

$(':input').each $this ->
    @val 'hello!'