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 さんクオリティ!
コードの標準化なぞ知ったことかっ!!(とは言ってない)