トップ «前の日記(2010-02-11) 最新 次の日記(2010-02-19)» 編集

Route 477



2010-02-18

[javascript][link] .sort.call(null)の深淵 - 素人がプログラミングを勉強するブログ

JavaScriptで、

[].sort.call(null)

がwindowに評価されるのはなぜ?という話。

  • callにnullを渡すと、thisがwindowになる
  • Arrayのsortは、ソートするものがないとき(つまり、lengthがundefinedか0か1のとき)はthisを返す

ということからwindowになると。へぇ。

ただしフレームを使ったサイトの場合、window.lengthが2以上になって上のような挙動にならなかったりするらしい。

[ruby] Hash、Mash、Dash

Hashieは、Hashと似たような(?)MashとDashというクラスを提供する。

Mashはostructみたいなオブジェクト。「?」で存在チェック、「!」で強制定義ができる。

conf = Hashie::Mash.new
conf.foo?  #=> false
conf.foo = 1
conf.foo    #=> 1

conf.bar!.baz = 2

例えばJSON返すAPIとかで、

res_hash["responseData"]["translatedText"]

Hashie::Mash.new(res_hash).responseData.translatedText

と書ける。書き捨てスクリプトとかでは楽。

(訂正:Hash#to_mashはありませんでした)

Dashはデフォルト値の書けるStructみたいな感じ。

class Person < Hashie:: Dash
  property :name
  property :email, :default => "no mail" 
end

me = Person.new(:name => "yhara")
me.email  #=> "no mail"

[ruby] Tilt

前に

Webサーバ・Webフレームワーク間をつなぐものとしてRackがあるわけだけど、 それならWebフレームワーク・テンプレートエンジン間をつなぐライブラリもあってしかるべきではないかと思った。

[20090208#p01より引用]

と書いたことがあるんだが、rtomaykoがやってくれました。

使い方は、viewのファイルを食わせて、renderを呼ぶだけ。

template = Tilt.new('templates/foo.erb')
output = template.render(Object.new, :x => 1, :y => 2) #=> String

これでさらに新しいweb frameworkが書きやすくなりましたね。

[javascript] CoffeeScript

RubyとPython的な記法でJavaScriptを単純化したようなスクリプト言語。 Rubyで書かれたJavaScriptへのトランスレータがある模様。

「CoffeeScript is just for fun and seriously alpha.」とのこと。

クロージャを使った関数定義の例(代入は「:」らしい)。

square: x => x * x
cube:   x => square(x) * x