12月 062013
methodmissingというnpmがあって、rubyのmethodmissingと同じく存在しなメソッドを呼び出した時にno method errorにするのではなく、メソッド名と引数を横取りできる。
使用例
mm = require 'methodmissing'
class Foo
baz: "bazbaz"
foo = new Foo()
## methodmissingを適用
foo = mm foo, (func_name, args) ->
console.log "missing-method '#{func_name}' called"
console.log args
## 普通のメソッド呼び出し
console.log foo.baz
## 存在しないメソッドを呼び出す
foo.kazusuke("niku", "beer", "rice")
実行結果
bazbaz
missing-method 'kazusuke' called
{ '0': 'niku', '1': 'beer', '2': 'rice' }
存在しないメソッドが呼び出された時に、動的にメソッドが存在するフリをできるのはWebAPIのラッパーを作る時などに便利。
高速化
ベンチマークを取ってみたら、
存在しないメソッド呼び出しをキャプチャーするのは6〜7倍ぐらい速くなった。普通のメソッド呼び出しと比べて10倍遅い程度。
また、methodmissing適用した後のオブジェクトは通常のメソッド呼び出しが100倍ぐらい遅くなっていたのを、9倍遅い程度に抑えられた。
(methodmissingでメソッドを呼び出すコストが通常のメソッド呼び出しに比べて10倍ぐらい遅くなるだけで、呼び出されたメソッド全体の速度が遅くなるわけではないので、ループで何万回も呼び出す等でない限りこのコストは無視していいと思う)
といっても修正したの1行だけなんだけど、けっこうこういうので変わるものだな
存在しないプロパティを呼び出した時の動作が遅いのがまだ気になる。