旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

CoffeeScript 好き好き日記

2013年10月23日

数ヶ月使ってるけどまだ好きなので、
便利・面白いと感じた書き方を紹介させていただきます。

[a,b] や {a,b} でローカル変数に展開

オブジェクトや配列をローカル変数に展開できる:

# 配列から
[a, b] = [1, 2]
a is 1
b is 2

# オブジェクトから
{a, b} = {a:1, b:2}

# for 文の中でも
for [a, b] in [[1, 2], [3, 4]]
  a * b

# 関数の引数でも
func = ({a, b}) -> a * b

コールバックの引数を定義・参照するのに便利:

emitter = (callback) ->
  callback {
    foo: 2
    bar: 3
    baz: 4
  }

# Pythonのキーワード引数みたいのが出来る
aCallback = ({foo, bar}) -> foo * bar

emitter(aCallback) is 6

クラス内ならこういうショートカットも可能:

class Foo
  # 矢印の先に何もないけど
  setVal (@val) ->

  # これと等価
  setVal (value) -> @val = value

・・・最後のは個人的にはあんまり好きじゃないけど。
矢印の指し先が無いと寂しい。

階層を一段展開したり、適切なローカル変数名を付けれるようになるので、
全般的に可読性が向上する仕組みだと思ってます。

new class extends

クラスを継承してインスタンスを作成する方法は普通こう書く:

class Bomb extends Item

bomb = new Bomb

これらのように書くこともできる

# 左辺で変数として受け取る
Bomb = class Bomb extends Item

# その場合、サブクラス名は省略できる
Bomb = class extends Item

# そのまま new できるんじゃね?
bomb = new class extends Item

# もちろん、インスタンス変数やクラス変数も使い捨てで定義できる
bomb = new class extends Item
  @myName: 'BOMB'
  doAction: -> 'Dokaaaaan!'

# コンストラクタに引数を渡す場合はこうしてね
bomb = new (class extends Item)(引数)

サブクラス名を省略した場合は Class.name が入らなくなるので注意
この場合は Bomb.name = ‘Bomb’ の値のことです。

サブクラスを作るテストを書いている時に便利だった。

array…

可変長引数の定義に使われることが多い ‘…’ (ドットドットドット):

func = (args...) -> args.join ','
func(1, 2, 3) is '1,2,3'

定義の時だけでなく、渡すときにも使える:

func = (a, b, c) -> a + b + c
func([1,2,3]...) is 6

arguments にも使える

# サブクラスのコンストラクタ引数を全部受け取りたい時に使える
class Foo
  constructor: ->
    super arguments...

# Backbone だとよくこう書く
class MyModel extends Backbone.Model
  initialize ->
    super arguments...

Python の args* と一緒?

そしてこれ、いわずもがなですが
JSの配列を引数へ展開するためだけの apply が・・・:

var args = [1, 2, 3];
var func = function(a, b, c){ return a * b * c; }
func.apply({}, args);

要らなくなる!楽!!

args = [1, 2, 3]
func = (a, b, c) -> a * b * c
func args...

ええっ? new でも展開できるのかい!?

new func([1, 2, 3]...)

制御構文が値を返す

Ruby が元ネタらしいですね:

oneOrTwo = if cond
    1
  else
    2

# 三項演算子はこう、ちょっと面倒い
oneOrTwo = if cond then 1 else 2

# switch で値を返すとカッコイイ
text = switch httpStatus
  when 200 then 'OK'
  when 300 then 'Wasureta'
  when 404 then 'Not Found'
  else 'Internal Server Error'

# for も返すよ!
list = for i in [0..9]
  i

# リストコンプリヘンショーン!
list = (i for i in [0..9])

# while は危険そうだから返さないっしょ?
# ・・・とか、そういう自制心はCSさんには無い
i = 0
list = while (i < 10) then i += 1

以上

他にもあるんですけど、すぐ思い出せません!
長くなったので、また別の記事でまとめさせていただくかもです。

「この書き方出来たらうれしいけどなぁ..」
  ↓
「うおお、マジで出来た!」

こういう嬉しいサプライズに満ち満ちているのが CS さんクオリティ!
コードの標準化なぞ知ったことかっ!!(とは言ってない)