CoffeeScriptのあまり知られていない文法

知られてない機能ってのは大抵公式リファレンスにのってない奴なんですが、結構便利なのがあるので紹介しておこうと思います。

ハッシュ値を取り出す方法

{abs, sin, cos} = Math

引数値でもパターンマッチ的に使うことができる。
次のコードが

$.get "/json", {}, (data) ->
  console.log data.a, data.b, data.c

このように書き換えられる。

$.get "/json", {}, ({a, b, c}) ->
  console.log a, b, c

すべてのオブジェクトがハッシュで表現されるJS、その拡張ならではの略記ですね
なお、展開後の変数にデフォルト引数は付けられなかったです。残念。

引数オブジェクト展開

arguments... で引数オブジェクトを展開することができます。

f = -> console.log arguments...
f 3, "hoge", [1..4]


クラスの継承時に使うことが多いです。

class A 
  constructor: (a, b = 3) ->
    
class B extends A
  constructor: ->
    super arguments...
    setTimeout (-> console.log 'hello'), 100

new A 3
new B 3, 4

元のコードの引数展開パターンを覚えておく必要はありません。rubypythonだと引数チェックで引数の数を数えて例外をはいてくれるのですが、JSは基本的にどんな引数呼び出しにも応じてしまいます。

for ... when 文

for i in [1..10] when i%2
  console.log i

実質的にfilter関数にかけたものと同じ振る舞いをします。([1..10]).filter (i) -> i%2 

for ... by

for i in [1..10] by 3
  console.log i

このケースでは1,4,7,10 になります。個人的には、あまり有用に使えたことがありません。

番外 機能候補

この記事を書こうと思ったきっかけなんですが、こういう記事が本家coffee-scriptのissueみてたらこういうものがあったからです。
Pull Request #2026: Add a power operator by charliesome · jashkenas/coffee-script https://github.com/jashkenas/coffee-script/pull/2026

議論は荒れてますが、たとえばこれが採用されたら n ** 2 で二乗できるようになるわけです。RubyPythonにはある機能ですね。


Issues眺めるのも楽しいですよ
Pull Requests · jashkenas/coffee-script https://github.com/jashkenas/coffee-script/pulls