1 名前: 【大吉】 mailto:sage [2009/01/01(木) 13:13:22 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.7 の使用をお勧めします】 ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。 1.9 の新機能の一部が利用可能なので初学者にお勧めです。 ※ただし十分安定しているとは言えないので プロダクション環境での利用にはお勧めしません。 関連スレやURLは>>2-8 あたりを見てください。Ruby on Railsの質問はRailsスレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
331 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 19:57:40 ] 厳密じゃなくていいのなら、文字列にして比較してしまうというのがいいかもしれん 一般的な用途では文字レベルでしか判断しないからな irb> (3.2-2.0).to_s == 1.2.to_s true
332 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 20:29:17 ] なぜ文字列にして比較を?? 数値の比較の話じゃなかったの?
333 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 20:59:37 ] >>332 文字列は てか浮動小数点の指数の基数って 初心者の頃はずっと10なんだと思ってた。 で、なんで誤差が発生するんだとさんざん悩んでみたり 今からしたら俺アホかと
334 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:02:00 ] しまったメインの話題を途中やめにしてた 数値を文字列に変換する過程である程度の誤差を丸めてくれるなら、 >>329 みたいな過程を記述する必要がないってこと たとえruby内で記録されている値が 1.19999999999 であっても 1.20000000001 であっても 表示するときは最下位を丸めて 1.2 になると。 浮動小数点はちょっとわかりにくいからwikipediaで調べてみそ ja.wikipedia.org/wiki/ 浮動小数点数
335 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:05:56 ] irb> (3.2 - 2.0) -1.2 < Float::EPSILON false これが true になるような左辺ってあるんだろうか
336 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:09:41 ] 左辺が絶対値ってことだと思うが左辺の方が小さかったらEPSILONの意味がないな
337 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:10:10 ] 0では?
338 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:11:50 ] nil?
339 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:19:19 ] www.google.co.jp/trends?q=php%2Cperl%2Cruby%2Cpythoin%2CASP.NET ちょびっと逆転してる
340 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:20:10 ] www.google.co.jp/trends?q=php%2Cruby&ctab=0&geo=US&geor=all&date=all&sort=0 間違えたこっちだった
341 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:27:17 ] >>332 目に見える範囲の小数が等しいかどうかを調べるだけなら これが「我々がアタマの中で考えてる」処理に一番近い どちらが大きいかということが必要な場合はあまり(あるいは全く)使えないので用途に注意
342 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:32:43 ] >>335 irb> (5.5 - 2.25) - 3.25 < Float::EPSILON => true
343 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:40:17 ] >>326 <=にしたらtrueになった irb> (3.2 - 2.0) -1.2 <= Float::EPSILON true
344 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 21:41:18 ] >>342 それは単に 0.0 なのでは 0.5 も 0.25 も割り切れてるもの
345 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 22:25:21 ] Float::EPSILON < Float::EPSILON false Float::EPSILON <= Float::EPSILON true 0.0 < Float::EPSILON true って話?
346 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 22:27:51 ] Float::EPSILON とは <= で比較するのが正しいのかな
347 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 22:30:50 ] A <= B と A < B || A == B の動作違うのってまずくね
348 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:00:14 ] rubyってDLL作れる? rubyで作ったプログラムをVBAやC#みたいな他ので使いまわせるようにしようと思ったら どういう形式がいい?
349 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:05:35 ] >> 336 マシンイプシロン Float::EPSILON は 1.0 + Float::EPSILON != 1.0 になる最小の数って意味だから違う。 IEEE754 の浮動小数点表現では、32 ビットの単精度でも指数部は 8 bits、仮数部 23 bit あるから EPSILON はせいぜい 2.0**(-23) 程度 >> Float::EPSILON + 1.0 == 1.0 => false >> Float::EPSILON/2 + 1.0 == 1.0 => true >> 1e-20 < Float::EPSILON => true だから、ちゃんと比較するなら絶対値で割ってから比較するべき abs((a-b)/b) < Float::EPSILON とか。b < Float::EPSILON のときの処理も必要だけど。
350 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:23:19 ] 1.0 + Float::HOGE == 1.0 になる最大の値 HOGE のことを何と言いますか
351 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:25:12 ] マシンウプシロン
352 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:29:49 ] Delphiだと引数にEpsilonを指定できる浮動小数用の比較関数(SameValueだっけか)が あるんだけど、Rubyにはないのん? いちいち絶対値とってそれがEpsilon以下って書かなきゃならない? 組み込みかライブラリであれば教えて頼む
353 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 23:32:30 ] i.loveruby.net/d/20040502.html
354 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:00:41 ] Ruby Cookbookに載っているコード class Float def approx(other, relative_epsilon=Float::EPSILON, epsilon=Float::EPSILON) difference = other - self return true if difference.abs <= epsilon relative_error = (difference / (self > other ? self : other)).abs return relative_error <= relative_epsilon end end 100.2.approx(100.1 + 0.1) # => true 10e10.approx(10e10+1e-5) # => true 100.0.approx(100+1e-5) # => false
355 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:04:56 ] 浮動小数点を比較しなきゃ逝けない用途って何? コンピュータに向いてない作業の一つだな。
356 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:14:26 ] シミュレーション?
357 名前:デフォルトの名無しさん [2009/01/11(日) 00:27:31 ] RubyでGUIアプリケーションは作成可能でしょうか? 友人からは、GUIアプリケーションは VC++、VBとかじゃないと無理と聞いたのですが・・・
358 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:37:12 ] >>340 日本ではまだまだ遠いな www.google.co.jp/trends?q=php%2Cruby&ctab=0&geo=JP&geor=all&date=all&sort=0
359 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:37:34 ] >>354 self と other を比較する前に絶対値とらないと駄目なんじゃ。
360 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:38:08 ] def check(name) /name/ =~ "hiroyuki" 以下略 で/name/ をnameでマッチさせるのではなく引数の値を使うにはどうすればいいでしょうか?
361 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 00:50:37 ] >>357 pc11.2ch.net/test/read.cgi/tech/1200175247/302-312
362 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:08:45 ] ここまでBigDecimalへの言及無し。 ttp://www.ruby-lang.org/ja/man/html/BigDecimal.html irb> require 'bigdecimal' => true irb> BigDecimal.new("3.2") - BigDecimal.new("2.0") == BigDecimal.new("1.2") => true
363 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:11:56 ] 浮動小数点数の比較の話をしてるんだからBigDecimalの出る幕は無いだろ
364 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:20:00 ] >>354 サンクス。組み込みではないっつーことか。 >>355 まーゲーム作るときとかちょっとした数値計算、 後ユニットテスト書くときなんかにはいるけど、 確かに最後の例以外Rubyには不適だかなあ
365 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:21:22 ] >>360 def check(name) name =~ "horioyuki" で、 check呼ぶ時に正規表現リテラル渡せばよいのでは? check(/.+oyu.+/)
366 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:26:58 ] ちょっとお聞きしたいのですが、 wikiとかの表示によくあるプログラムの実行時間を 自分のスクリプトで表示したいのですが、 簡単にmsecの実行時間を測る方法はないでしょうか? スクリプトの終了前に puts Process.times.to_yaml とかやってみたんですが、表示がさっぱり?です。 utimeとstime を足したものが実行時間なのかな?
367 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:28:51 ] あれは単にWikiテキストの処理開始時と 処理終了時の差を取っただけなんじゃないか?
368 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:31:14 ] >>366 基本的な計測はbenchmarkライブラリ(標準添付)でOK あと、「Ruby プロファイラ」で検索すると色々出てくる
369 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:33:47 ] >>363 おおもとは、>>323 > (3.2-2.0) == 1.2 がfalseの理由を教えて下さい。 だから、小数を含む数の扱いについて一通り言及すべきだと思うんだ。
370 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:40:08 ] >>365 nameに渡す文字列はARGV.shiftで受け取ったものなんですよ・・・。 グローバル変数にすればよかったりしますかね・・・。
371 名前:370 mailto:sage [2009/01/11(日) 01:54:40 ] グローバルしてみましたが結局 =~ の 左辺,右辺に変数がきてもいいのでしょうか?
372 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:10:29 ] def check(name) /#{name}/ =~ "hiroyuki" end p check("hiroyuki") # => 0
373 名前:370 mailto:sage [2009/01/11(日) 02:17:30 ] >>372 ありがとうございました!!!!!!!!!うまくいきました。 =~の左辺の#{name}っていうのは変数としてみるってことですか?
374 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:18:34 ] >>368 サンクス benchmarkクラス使ってみる
375 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:28:14 ] >>373 まあそんな感じだ 「式展開」について勉強すればよくわかる www.ruby-lang.org/ja/man/html/_A5EAA5C6A5E9A5EB.html#a.bc.b0.c5.b8.b3.ab
376 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:28:22 ] 変な質問なうえにおそらく出来ないんだろうけど一縷の望みをかけて質問 メソッドの入れ子って出来ますか? たとえば、 def method1 処理 def method2 処理 end end としたら、method1だけ呼びだしたらmethod1の処理のみで終了。 method1.method2みたいに呼びだしたら両方の処理を実行、みたいな。 この書き方だと ttp://www.ruby-lang.org/ja/man/html/_A5AFA5E9A5B9A1BFA5E1A5BDA5C3A5C9A4CEC4EAB5C1.html#a.a5.e1.a5.bd.a5.c3.a5.c9.c4.ea.b5.c1.a4.ce.a5.cd.a5.b9.a5.c8 みたいになっちゃうから無理なのは明白だけど・・・ method1に引数を与えてmethod2の処理をif文でくくって引数の値で処理するか否かを 決めるって方法もあるけど、見た目的にごちゃごちゃするから嫌というか・・・ なんかいい方法あったら教えてください。
377 名前:370 mailto:sage [2009/01/11(日) 02:31:30 ] >>375 ありがとございます。 昨日Rubyはじめたばっかりでいろんなサイトからつぎはぎで趣味プログラムしてたんで リファレンスマニュアルというのをみてませんでした。まず、一読してみます!
378 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:32:20 ] >>376 無理 素直にモジュール使って、Mod1.method1としなされ
379 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:34:20 ] >>376 それではmethod2を定義しているだけで,method2を呼び出してはいない def method1 puts "call method1" def method2 puts "call method2" end method2 end
380 名前:379 mailto:sage [2009/01/11(日) 02:35:59 ] ごめんはやとちりした
381 名前:376 mailto:sage [2009/01/11(日) 02:45:25 ] >>378 無理かぁ・・・ありがと Mo1.method1・・・method2はどこへ? 実はmethod1の処理がイテレータを含んでいて、変数を一周するたびに初期化して使うんだけど、 場合によっては初期化する前にmethod2の処理でその変数を使いたいから↑のようなことに・・・ モジュールだとダメそうなのでおとなしく引数と条件文で動かします。。 >>380 ドンマイw
382 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 02:47:47 ] >>376 def method1 処理1 Proc.new do 処理2 end end method1 method1.call 近いことを無理やりやろうとすれば、 こんなのは思いつくが、普通はやらない 端的に言って不気味すぎる
383 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 03:00:57 ] いやいや、初心者のこんな突拍子もないアイデアから、すごいアイデアがでたりする。 1000個に1個ぐらい。 だから初心者は1000個のアイデアを出すんだ!
384 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 03:14:53 ] callが気に食わない def method1 処理1 pr = Proc.new do 処理2 end pr.instance_eval "alias :method2 :call" pr end method1 method1.method2
385 名前:376 mailto:sage [2009/01/11(日) 03:22:55 ] >>382 おお、できるんだ!? ありがと〜 ぶ、不気味なのか・・・ >>384 求めていたものが完璧に・・・お見事です。 お二方、ありがとうございます。
386 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 03:40:36 ] 開発環境なに使ってますか? 自分はLinuxでは基本Netbeansで、ちょっとした修正はemacsで。 eclipseとかもあるけどどんな開発環境使っているか気になったので・・・。
387 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 03:59:55 ] vi
388 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:07:59 ] 今時 vi はないだろう vi は。 俺は断然 vim だな。
389 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:10:20 ] メモ帳
390 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:14:26 ] 俺はEclipseにRubyプラグイン editer使ってる人は補完なくて大丈夫なの?
391 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:25:12 ] いや、もちろんエディタにも補完はあるよ VimのRubyに対する補完はかなり強力。それ以上に操作性が好きで使っているけど
392 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:29:52 ] ずっとEmacs ちなみにMatzもEmacs まあ人に何が良いか,って聞かれたらNetbeans勧めるかもな
393 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 04:30:07 ] viの学習曲線の最初でくじけたのでemacsで
394 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 07:48:14 ] 俺は断然 vi
395 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 08:18:34 ] あんな日本語も通らない化石エディタよく使う気になるな
396 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 08:56:02 ] 個人用途なので基本的にはどうでもいいんですが気になるので質問します HTMLとかから正規表現とかでデータ抜き出して、データ保管クラスのインスタンス変数に保管します。 initialize の時点でたくさんのインスタンス変数に値を入れたいんですが、 def initialize(params, data) @a = params[:a] @b = params[:b] @c, @d, @e = parse_in_init(data) end と def initialize(params, data) @a = params[:a] @b = params[:b] make_c_d_e(data) end def make_c_d_e(data) @c = someprocess1(data) @d = someprocess2(data) @e = someprocess3(data) end って、どっちが見通しいいもんでしょう? ちょっと面倒でも明示的に代入の形を見せる前者のほうが初期化プロセスっぽく見えて好ましい?
397 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 09:03:43 ] >>396 YES ただ、make_c_d_e みたいなそれっぽいのが initialize の直後に定義されてれば 「あーinitializeの続きかー」と思って読むから別に気にはしない Util.parsehtml とかどっか遠いとこに定義されてるクラスメソッドがinitializeで呼ばれてるとやる気なくす
398 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 09:38:12 ] def initialize(params, data) @params = params @data = parse_in_init(data) end
399 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 09:43:49 ] >>398 なにそのユーザー丸投げルーチン いちいちハッシュの引数で参照するのがめんどいまたは間違いやすいからインスタンス変数にしてんじゃねの
400 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 09:45:50 ] >>399 @params を書き込み可能にしておけば外部からデータ追加するのも楽々だぜ?
401 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:09:51 ] >>400 外部からデータを追加する必要があって、なおかつその方法しか考えられないようなときなら一理あるけど そうでなければ、ここでハッシュを使うのは問題が大きすぎる
402 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:15:06 ] Javascriptだと a={'hoge': huga, 'hage': fuga}; a.hoge a.hage にアクセス出来ていいんだよね
403 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:17:30 ] Ruby でもやろうと思えば出来るっしょ
404 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:17:39 ] アクセサ作ればいい めんどくさいけど
405 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:24:49 ] StructA = Struct.new(:hoge, :hage) a = StructA.new('huga', 'huga') p a.hoge p a[:hoge] p a[0] "huga" "huga" "huga" オーイエー >>402 どっかのgemにそんなのあったな
406 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:44:53 ] 来たなStruct厨 総員迎撃準備
407 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:51:36 ] Structって嫌われてんの?
408 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:01:58 ] Struct.newにJSONぶっこめる?
409 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:09:18 ] >>407 他言語から来た人がArrayやHashを使い込むことなく安易に使うものの代表だから、嫌がられてはいるね まずはArrayとHashを使い倒してからにして欲しいなと思う所存 >>408 分けてくれ
410 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:38:19 ] >>395 通るぞ?@Solaris10
411 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:39:19 ] ttp://www.ruby-lang.org/ja/documentation/ ここの検索こわれてるみたいなんだけどいつ治りますか
412 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:41:36 ] >>410 動物は一度鎖に繋がれてしまうと鎖が杭から外れていても 逃げられないと思い込んでしまうものなのです
413 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 11:42:25 ] >>410 それは日本語パッチ当たってるんじゃね てか、「お前らが使ってるのは vi じゃなくて vi クローンのどれかまたは vim だろ」というツッコミを 誰かがしないと終わらんな
414 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 12:25:43 ] >>413 OS標準。つか、Solarisは遠い昔から、日本語localeが入ってりゃちゃんと日本語使える。(viに限らず。そのせいで痛い目にあうこともまれにあるが)
415 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 13:15:48 ] emacs入ってない環境はたくさんあるけど、viが無い環境は稀。 まあ開発環境は何でも好きなの自分で入れろよと思うけどな。
416 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 14:49:23 ] だからメモ帳最強って何度言わせるんだよ!!
417 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 14:55:18 ] Windows環境でJmEditorとRDEとNotepad++を使い分ける俺に隙はなかった
418 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:08:19 ] >>415 のようなことを稀に聞くが、vi でファイル編集できない人間などおらん
419 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:21:16 ] Windows環境で、class Hoge(もしくは、def hoge、each do |x|)と打ってリターンをすると、 以下のように、endを付けインデントした位置にカーソルを持ってくるエディタはありますか? class Hoge[Retrun] ↓ class A | end
420 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:25:32 ] Meadow(or Xyzzy)を入れて自分で作れってのはなし?
421 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:25:41 ] >>419 xyzzyをカスタマイズ
422 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:46:14 ] >>420-421 自分でカスタマイズする技量がないのであきらめます
423 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:53:58 ] Solarisのviはずいぶん昔から日本語通るぞ。SunOS4は忘れたが。 ただ、Localeに縛られるので、Shift_JISのファイルなんかが来ちゃうと面倒。 LANG=とsettermでなんとかなった気もするけど、もう忘れた。 って無駄レスだな。
424 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:08:58 ] 以下、Personクラスの配列membersを、名前→性の順でソートすると、名前のソートがくずれます。 くずれないようにソートするにはどうすればいいのでしょうか? class Person attr_reader :name, :sex def initialize(name, sex) @name, @sex = name, sex end def show [@name, @sex] end end members = [] members.push Person.new("sasaki", "male") members.push Person.new("kato", "famale") members.push Person.new("fukada", "male") members.push Person.new("akai", "female") p members.map {|p| p.show } #=> [["sasaki", "male"], ["kato", "famale"], ["fukada", "male"], ["akai", "female"]] p members.sort_by {|p| p.name}.sort_by {|p| p.sex}.map {|p| p.show } #=> [["kato", "famale"], ["akai", "female"], ["fukada", "male"], ["sasaki", "male"]] #=> 望ましい結果 [["akai", "female"], ["kato", "famale"], ["fukada", "male"], ["sasaki", "male"]]
425 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:12:32 ] members.sort_by {|p| [p.name, p.sex]} じゃね?
426 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:21:48 ] 配列の比較に関してはドキュメントが弱いんだよね [1,2,2] < [1,2,3] [1,1,2] < [1,2,2] [1,4,4] < [2,1,1] x でソートしたあとに y でもソートしたいという場合は、Rubyでは data.sort_by{|a| [a.x, a.y]} と書く
427 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:28:14 ] >>425 それだと、 [["akai", "female"], ["fukada", "male"], ["kato", "famale"], ["sasaki", "male"]] となり、性のソートがくずれてしまいました。
428 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:55:33 ] >>427 どうソートしたいのか考えれ 崩れるも何も、ソートする順番の問題に過ぎない class Person attr_reader :name, :sex def initialize(name, sex) @name, @sex = name, sex end def show [@name, @sex] end def Person.sort_sex(sex) if sex=='male' then 1 else -1 end end end members = [] members.push Person.new("sasaki", "male") members.push Person.new("kato", "famale") members.push Person.new("fukada", "male") members.push Person.new("akai", "female") members.sort_by {|p| [Person.sort_sex(p.sex), p.name]}
429 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 17:09:06 ] >>428 うまくいきました。 サンクス。
430 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 18:13:53 ] diaspar.jp/node/185
431 名前:デフォルトの名無しさん [2009/01/11(日) 19:37:19 ] Hpricot::Elem.new(Hpricot::STag.new('form')) をノコギリで書き換えようと思い Nokogiri::XML::Node.new('form')としたら ArgumentError: wrong number of arguments (1 for 2) のエラーが出ました。 RDocには,new(name)、と引数は一つなのですが,どうしてでしょう。このnameはStringで与えてもだめ?