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