Array#flatten は配列をたたむメソッドです。 ary = [ [1], [2, [3], 4], [5] ] p ary.flatten #=> [1, 2, 3, 4, 5] このメソッドは便利に見えて、非常にはまりやすいメソッドです。このメソッドはたたみすぎるんです。上で言うと、[1, 2, [3], 4, 5] を返してほしいのです。 例えば、「ちょっと x と y の組を作りたいけど、いちいち Point クラスを作るのは面倒」というようなときに、横着して [x, y] という配列を使います。その後、「座標の配列の配列」から「座標の配列」を作ろうと思って flatten すると、なんと「x と y が順に並んだ配列」ができてしまいます。これはたまりません。 この例だけ見れば「横着すんな」で終わりそうですが、 そうは言っても使い捨てプログラムでは横着したいし、 連想配列か
http://shinh.skr.jp/m/?date=20080823#p01 >RubyコードをRubyで等価に実行可能な記号だけに変換する プログラムは書けるだろうか。 eval"実行したいコード" を記号だけで表現すればいんじゃね? と適当に変換プログラム書いてみた。 def _(_) r="''<<"+_.split("").map{|_| _=_.ord; return "~-_" if _==0 (["_"]*(_&3)+["__"]*(_>>2&3)+["___"]*(_>>4&3)+["____"]*(_>>6&3))*"+" }*"<<" "->{_=-~($$-$$);__=_<<_+_;___=_<<__;____=__<<__;%s}[]"%r end puts"->&_{_}[&:\"\#{#{_"method"}}\"][$$,:\"\#{#{_"eval"}
Ruby 1.9 の新機能のひとつに「lambda { ... } を -> { ... } と書ける」というのがあります。この表記は反対意見が根強い *1 ですが、確実にすばらしい点があって、全部記号だということです。これによって Ruby が記号だけでチューリング完全になります *2 。 デモとして、brainfuck インタプリタを記号だけで書いてみました。 $___,@_,@__,$_=(@@__="")=~//,?#=~/$/,->(_){_<(__="####"=~/$/)**__&&(@@__<< _;@__[_+@_])},[*$<]*@@__;@__[$___];$____,$_,@___,$__,@__=$_[@_+($_+?!=~/!/ )..-@_],$`,[],[],->(_){(__=$_[_];__=~/[><+\-\.,]/?$__<<$_[_]:__==?
なんか偉そうな見出しですが、ruby 1.9 を主に使うようになって 1 年ちょっと経ったので、1.9 の新機能に思うところや注意点などを書き残そうと思うのです。さらに 1 年後に見たとき、「あのころはあんなふうに考えてたなあ」などと感慨にひたる予定です。 あらかじめ断っておくと、ぼくの ruby 1.9 経験はすべて趣味範囲なので、エンタープライズとかシステム運用の問題とかは知りません。あとぼくは ruby のコミッタなので、色眼鏡もあると思います。あしからず。 YARV VM 実行になったという話。一般的には「速い」という文脈で語られます。1.8 と比べると確かに速いです。でも、1.9 ばかり使い出すとなんとも思わなくなるはずです。速さなんて相対的な価値ですから、当然ですけどね。好意的に考えれば、「なんとも思わない程度に、遅くて困ることが減った」のかもしれない。 コンパイルフェーズを挟
Ruby 1.9に移行する際に注意すべき10のポイント - なんとなく日記 ==== Symbol が String のように Symbol が String のようになる.正規表現や upcase/swapcase,その size を得ることができ る.この目的が何なのかわからない.完全に String のようになるのでなければ,これ以上 Symbol を String のようにしたくない. 「これ以上SymbolをStringのようにしたくない」という気持ちはわかるのだが、致し方ないとしか言いようがない。俺も最初はキモいと思ったのだが… なぜなら、以下の変更のため。 ==== メソッド名は Symbol で返る 1.9 では obj.method や klass.instance_methods が,String ではなく Symbol を返すように なる.もし String で欲しい
色々気になったので試してみた。 require "benchmark" array = Array.new(100){ |index| index }.sort_by{ rand } array1 = array.dup array2 = array.dup array3 = array.dup Benchmark.bm(16) do |bm| bm.report("sort.reverse "){ 1000.times{ array1.sort.reverse } } bm.report("sort_by{-val} "){ 1000.times{ array2.sort_by{ |value| -value } } } bm.report("sort_by.reverse "){ 1000.times{ array3.sort_by{ |value| value }.reverse }
「食事してから行きます。なにもいりません」って言ってるのに、姑が「お茶代わりに」って言って出してきたのは・・・。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く