From: Kenya Ogata Date: 2000-08-29T22:03:45+09:00 Subject: [ruby-list:24630] Re: Ruby の落とし穴 おがたです。 自分が詰まったところを集めてみました。 しかし、今回まとめようと思って改めて FAQ や ML トピックスを 見直したのですが、同じ話が多いですね。 惜しむらくは、ドキュメントの内容が多岐にわたっていて探しづ らいのと、トピックスと FAQ に分散されている事でしょうか。 常時接続のような体制でないと探すのは大変だと感じました。 一件一ファイルの形で圧縮して落とせるようにしてあると(あるい は CVS がなお良いのかもしれませんが) Namazu 等にかけられる ので、ホームユーザにもありがたいと思います。 * 配列内の値の変換 a = [1,2,3] a.each{|item| item = item + 10} # 誤り a.collect!{|item| item + 10} 代入した時点で元の item (配列に格納されているもの)とは別の オブジェクトをさすためです。従って、 a = ['a','b','c'] a.each{|item| item.replace('x')} など、破壊的メソッドは有効となります。 * メソッド呼び出しで 配列を展開した変数列を渡す def sum(a,b.c) print a+b+c,"\n" end a = [1,2,3] sum(*a) # -> sum(1,2,3) -> 6 * 任意のループを抜ける catch(:last) { while true (1..5).each{|x| throw :last if x == 3 print "#{x}\n" } end } * 時間待ちの処理 require 'timeout' begin timeout(5) do $stdin.gets end rescue TimeoutError print "timeout\n" end 以下の例ではうまく機能しませんでした。 ( ruby 1.6.0 cygwin1.1.2) require 'timeout' i = 0 begin timeout(5) do while true p (i+=1) end end rescue TimeoutError print "timeout\n" end * 16 進数文字列を 10 進数文字列に変換する i = "f".hex print i, "->" ,format("%x",i) * 組み込みクラスへの破壊的メソッドの追加 class String def sample! self.replace('sample') # self = 'sample' # これは誤り end end * 配列への nil の挿入 a = [1,2,3] a[1,1] = nil # a[1.1] = nil.to_a を行っている p a # [1,3] a = [1,2,3] a[1,1] = [nil] p a # [1,nil,3] これは、nil.to_a が [] (空の配列)を返すために起こります。 ちなみに nil.to_s は "" (空の文字列)を返します。 --------------------------------------------------- Kenya Ogata E-mail k_ogata@mbd.nifty.com HomePage http://homepage1.nifty.com/~k_ogata/ruby/diary.html