前日に @ujm さんとニアミスするなどした流れで、うっかり kanasan.coffee に参加してコーヒー飲んできました。少し遅れて行ったので前半はあんまりついていけなかったんだけど、jasmine-node の辺りから手を動かしてみました。
$ cat lib/string.coffee String::truncate = (length = 30, truncation = "...") -> if @length > length @slice(0, length - truncation.length) + truncation else @
まぁこれは「@yhara さんと読む CoffeeScript の言語仕様」のあとで書き直したものだけども。-> が function なのはいいとして、:: が /\.prototype\.?/ とか @ が /this\.?/ とかよく出来てる。デフォルト付きの引数がかけたり、(constrcutor の)引数にそのまま @ 付きの変数を置けたりするのはいいなぁ。後者は Ruby 1.8 だと define_method(:initialize){|@iv|} とか出来たんだけど、1.9 からは出来なくなったし。まぁ、しないけど。
$ coffee --bare --print lib/string.coffee String.prototype.truncate = function(length, truncation) { if (length == null) { length = 30; } if (truncation == null) { truncation = "..."; } if (this.length > length) { return this.slice(0, length - truncation.length) + truncation; } else { return this; } };
こんな感じにコンパイルされるのね。
で、
$ cat spec/string_spec.coffee require "../lib/string" describe "String#truncate", -> it "should pass", -> expect("string".truncate()).toEqual("string") expect("longstring".truncate(9)).toEqual("longst...") expect("looooooooooooooooooooooooooooooooooooongstring".truncate()).toEqual("loooooooooooooooooooooooooo...") expect("string".truncate(3)).toEqual("...") expect("Is this a bug?".truncate(2, "???")).toEqual("Is this a bug???") $ jasmine-node --coffee spec Started . Finished in 0.002 seconds 1 test, 5 assertions, 0 failures
こんな感じに spec を確認できる、と。事前にコンパイルしなくても、--coffee オプションさえつけとけば勝手によろしくやってくれます。逆に、コンパイル結果を lib/string.js に保存しちゃって、basename だけで require してるのもあって、lib/string.coffee を編集してるのに反映されねー、となりました。
それはそれとして、この truncate って truncation より短く切り詰めようとすると伸びるのね。prototype.js も ActiveSupport のやつも同じ動きなんだけど。
あと、気になったのは ?。
lottery = drawWinner: -> address: zipcode: "661-0976" zip = lottery.drawWinner?().address?.zipcode
途中でどのキーがなくてもエラーにならず zip は undefined になるという。ActiveSupport の {Object,NilClass}#try ということかな。
lottery = { drawWinner: ->{ {address: { zipcode: "661-0976" } } } } zip = lottery.try(:[], :drawWinner).try(:[]).try(:[], :address).try(:[], :zipcode)
こっちはあんまりうれしくないなぁ。
まぁ自分が次に CoffeeScript を使うのはまたどこかの勉強会で、って感じだろうけど、急に行こうと決めた割に楽しめたのでよかったです。ありがとうございました。
@slice() は @[0...e] とも書けます。 <br>望めば0も省略できます。
なるほど! <br> <br>$ coffee <br>coffee> "string".slice(0, 3) <br>'str' <br>coffee> "string"[0...3] <br>'str' <br>coffee> "string"[...3] <br>'str' <br>