2010年03月28日

ruby:ブロックも保存出来るよーな

このブログは証明できない。さん
■[Ruby]Rubyのblock、Proc、lambdaを理解する
http://d.hatena.ne.jp/shunsuk/20090101/1230816826

blockとProcの唯一の違いは、blockは保存できないということです。

トラックバック頂きました。なるほどー勉強になります。
んー。そうするとさらに疑問が出てきますね。Block が渡された関数内ではすでに Proc オブジェクト。ブロックはいつ Proc オブジェクトになるのかなぁ。ブロックを受け取る与え値に & が要るし、ary.each &a とすればOKとのことですし・・・。& かな。と、仕様書頼るかぁw(10/04/10)

とのことですが保存出来るんでは?
と、言いつつ ruby は rail をインストールしてちょこちょこっと弄っただけなので全然分かってない。つらつらマニュアル見るとプログラマの欲望を詰めに詰め込んだ言語ですねー。いや、すばらしいw 引き合いが少ないので使えないのが残念。

例えば、こんな事ではダメ???

def ref(&block)
block
end

a = ref {
  puts "ok!"
}

a.call # ok!
puts a.class # Proc class

ブロックを返せばどんなでもいいけども。a は ブロックへの参照だし、a のクラスを見ると Proc になってる。ブロックは単純に Proc クラスのインスタンスって考え方じゃダメなん?もちろん、使いまわし出来る。

def evl1(block)
  block.call
end

evl1 a # ok!

ただ、ary.each a なんて感じで使いたいけど・・・。このままだとエラーになる。
多分、なんとか出来るんだろーけど。知識も経験も圧倒的に不足してるw



posted by HiFa at 01:30 | 🌁 | Comment(2) | TrackBack(1) | へなちょこruby | このブログの読者になる | 更新情報をチェックする

2010年03月26日

javascript:for の小ネタ

for の小ネタと checkbox を同期させる tip の例です。
すみません。色々間違ってましたので改めて書き直しました。(同日追記)

ふと、さらに追記w(10/03/29)

for で走査したいとき・・・。

elements = document.getElementsByTagName('DIV');
for(var i = 0, l = elements.length; i < l; i++) 処理・・・

なんてのが常道なのかな。
ちなみに l に length 入れるのは、その方が速いから。
そこで

elements = document.getElementsByTagName('DIV');
for(var l = elements.length; l--;) 処理・・・

こうするともっと速くなるし、変数も一つ減る。
で以降、実例です。

続きを読む
posted by HiFa at 01:30 | 🌁 | Comment(1) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2010年03月18日

javascript:ちょっと粋な配列の定義だけども

たまに見かける split を使った配列の定義ですが、当然の事ながら遅いです。それに、ff3 では驚いた事に new Array() を使った方が圧倒的に速い。

ary = 'a b c d e'.split(' ');
ary = ['a', 'b', 'c', 'd', 'e'];
ary = new Array('a', 'b', 'c', 'd', 'e');

ie7 で 3倍程度、op10 で 2倍弱、safari/chrome では信じられないほどの差になります。ただ vista, ff3 は安定していないようです。[e1,e2,e3,…] と普通に列挙したものは安定しているのですが、split を使うと早い時と遅い時で 5倍近いブレがあるようです。ただ、他のブラウザでは2番目と3番目に有意義な違いはなかったのに ff では圧倒的に3番目が速いです。

とは言え、何度も回すような事をしなければ split は分かりやすい。・・・なんて事を言いながら自分は使ってない ^^;;; 一つや二つならまだしも、意識せず使いまくれば体感で差がでる可能性もある。

結局、split は使わない。[] が良いんでしょうけど、ff を考えれば new Array が最も無難。ただ、一々 new Array なんてやると「知らない」と思われそうでイヤですね(笑)

以下テスト用コード
var t = (new Date()).getTime();
for(var i = 100000; i--; ){
  r = '0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49'.split(' ');
}
t = (new Date()).getTime() - t;

var j = (new Date()).getTime();
for(var i = 100000; i--; ){
  r = [
    '0','1','2','3','4','5','6','7','8','9',
    '10','11','12','13','14','15','16','17','18','19',
    '20','21','22','23','24','25','26','27','28','29',
    '30','31','32','33','34','35','36','37','38','39',
    '40','41','42','43','44','45','46','47','48','49'
  ];
}
j = (new Date()).getTime() - j;

var k = (new Date()).getTime();
for(var i = 100000; i--; ){
  r = new Array(
    '0','1','2','3','4','5','6','7','8','9',
    '10','11','12','13','14','15','16','17','18','19',
    '20','21','22','23','24','25','26','27','28','29',
    '30','31','32','33','34','35','36','37','38','39',
    '40','41','42','43','44','45','46','47','48','49'
  );
}
k = (new Date()).getTime() - k;

alert(t + "\n" + j + "\n" + k);

このテストに限りませんが、実は評価の順序でも「差」がでる事があります。当然、立ち上がっているアプリケーションの影響も受けます。何度か入れ替えながら評価すると良いかも。

addon について語れるほど知りませんけど、addon が山の様に積めこまれてれば影響を疑った方がいいかもしれません。たまーに spinoff のモノで云々あったり・・・。

posted by HiFa at 12:38 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする