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