From: shukaku@... Date: 2002-02-14T09:47:13+09:00 Subject: [ruby-list:33913] Re: arguments for def At Thu, 14 Feb 2002 02:58:49 +0900, Masaaki Sakano wrote: > > rubyunit は、クラス(やプログラム)の挙動を調べるもの、つまり、プログ > ラムの中に p やら if やら書き込んで調べる代わりに、それを別ファイル > に書いて扱うためのフレームワーク、というものだと理解しました。 XP(eXtreme Programming)のことを調べていただくと必ず出てくる話題で、ちょっ とコードを書いては、その部分をすぐに試験するためのものです。少しずつプ ログラムを作り、作った部分が意図通りに動くことを常に確認し続けるという 感じです。 対象(メソッドなど)の入力と出力の関係を対象としていて、内部の処理そのも のは検査しない、ということでいいんですよね? >詳しいかた # ゆえにリファクタリングで内部構造が変わっても、外部から見た挙動が同一 # なら良し、と...。 > # 実は直接 lint してくれるのか、と期待していたのですが…ちょっと目的 > # が違うようですね。 確かに文法上の誤りや危険箇所を指摘するものではありませんね。テストケー スの作り方によっては、誤りを検出できませんし。なので、元々の話題にはちょっ と沿わないかも知れません。 > # とはいえ、rubyunit は使い手がありそうです。今後色々試してみます。 はい、ぜひぜひ。慣れると手離せませんよ〜。特に、うっかりバグを作り込ん でしまった場合などにはすぐ気付きますから。(^_^; > 1. 以下の1行ファイル( clone.rb )を用意して、ライブラリパスに置く。 > def clone(*a) a.map{|i| i.clone} end (略) > などとして、最初に一気に引数を(同じ名前で) .clone する > # Editor で括弧ごとコピーすればいいので、考えなくてよくて楽。 上記の真似をして書いてみました。代入に見せず、引き数名を1回だけ書くよ うにしてみました。実用性や速度は度外視してます。 ---------------- ここから ---------------- def make_clones( bind, names ) names.split( "[, ]+" ).each do | name | eval( "#{name} = #{name}.clone", bind ) end end class String def abcdef(s) s << "abc" s+="def" end def abcdef_2(s) make_clones( binding, "s" ) s << "abc" s+="def" end def abcdef_3( s1, s2, s3 ) make_clones( binding, "s1, s2, s3" ) # 引き数をそのまま文字列に。 s1 << "abc" s1 += "def" s2 << "ABC" s2 += "DEF" s3 << "123" s3 += "456" end end a = "" b = "xyz".abcdef( a ) puts a puts b puts "-" a = "" b = "xyz".abcdef_2( a ) puts a puts b puts "-" a1 = "aaa" a2 = "bbb" a3 = "ccc" "xyz".abcdef_2( a ) puts a1 puts a2 puts a3 ---------------- ここまで ---------------- ///// ------------------------------------------------------------------ -O-O- 斉藤 秀格 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido) _ master@shukaku.nu (ぱふ) http://www.pugh.palm-j.com/ (旧URL: "http://i.am/PUGH")