2011-05-07 [長年日記]

_ ちょっとコーヒー飲んできた #kanasancoffee

前日に @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 を使うのはまたどこかの勉強会で、って感じだろうけど、急に行こうと決めた割に楽しめたのでよかったです。ありがとうございました。

本日のツッコミ(全2件) [ツッコミを入れる]
_ nanki (2011-05-11 18:45)

@slice() は @[0...e] とも書けます。 <br>望めば0も省略できます。

_ いまい (2011-05-11 18:50)

なるほど! <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>

[]

«前の日記(2011-05-02) 最新 次の日記(2011-05-12)»