トップページ⇒tech
1001コメント345KB

Ruby初心者スレッド Part 11

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/03/23(金) 08:54:39
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す http://www.ruby-lang.org/ja/man/
 ・FAQを読む http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


宗教的な話題は禁止します。
0153デフォルトの名無しさん2007/03/30(金) 16:50:30
>>152
・ちょっとした小物(shellスクリプトでやるようなのも全部Rubyで)
・HTMLから、RSS生成したり
・他小物CGI
0154デフォルトの名無しさん2007/03/30(金) 17:22:06
PC使う際の「手足」に使ってる

聞いてどうするんだという気はせんでもないが
0155デフォルトの名無しさん2007/03/30(金) 17:23:16
なんかRubyで書かれた実用的なソフトってあんの?
いまんとこレイルズくらい?
0156デフォルトの名無しさん2007/03/30(金) 17:23:38
>>153
う〜ん、やっぱり用途が似てますね…

自分の場合、大きな物作らないから
いつまで経っても、Rubyはスキルアップしないですねえ…
言語仕様も色々と機能が豊富みたいなんですけど
作るスクリプトが小物なんで、使うまでもない物が殆どなんですよ。
0157デフォルトの名無しさん2007/03/30(金) 17:25:36
>>155 が釣りなのは俺にもわかった
0158デフォルトの名無しさん2007/03/30(金) 17:27:54
>>154
手元に置いて、便利に使える道具的な使い方が多いですよね。

みんな一番大きなのでどの位の規模の作ったのあります?
自分はせいぜい、2000ステップくらいのCGIですね…
0159デフォルトの名無しさん2007/03/30(金) 17:27:58
USBメモリなどにrubyをに入れて rubyのインストールされてない環境で実行したいんですが
それは可能ですか?
0160デフォルトの名無しさん2007/03/30(金) 17:30:36
>>159
Winなら、Exerbとかruby2exeとかで
バイナリにする方法もあるよ。
0161デフォルトの名無しさん2007/03/30(金) 17:34:33
700ステップくらい
しかしメソッドチェーンやワンライナ多用だから指標になるのだろうか…
0162デフォルトの名無しさん2007/03/30(金) 17:36:31
つーか、ステップの数え方は?
01631582007/03/30(金) 17:39:15
>>162
自分は、空白、コメント等もすべて入れてです。
HTMLもコード中に埋め込んでる様な汚い物なんで
純粋なRubyのコードだけでいうと半分くらいしかないと思いますけど。
01641592007/03/30(金) 17:41:18
>>160
素早い回答ありがとうございます

えっと バイナリにするのではなく
ruby環境を持ち運んで 別PCで開発&実行ということは可能でしょうか
0165デフォルトの名無しさん2007/03/30(金) 17:42:53
星野真里のファンは誰だよww
0166デフォルトの名無しさん2007/03/30(金) 17:43:16
>>163
ERbLightとかでhtmlを外部ファイルにするとかなり楽になるよ
0167デフォルトの名無しさん2007/03/30(金) 17:43:16
>>152
あと、
・でかいプロジェクトのRakefile
素のmake使えなさすぎ

>>159
USBストレージにいれて動かしている。とりあえず、パスさえ通せば使えるはず。
rubyスクリプトを動かしたいだけなら、ruby2exeとか、exerbで。
0168デフォルトの名無しさん2007/03/30(金) 17:50:10
ステップで物数えんな
0169デフォルトの名無しさん2007/03/30(金) 17:52:37
>>166
確かにHTMLは外部にしなきゃダメだとつくづく思います…
そうしないと、もうRubyのコードとは思えない程汚いです。
0170デフォルトの名無しさん2007/03/30(金) 17:53:06
>>135
つシュワルツ変換
0171デフォルトの名無しさん2007/03/30(金) 17:54:49
>>168
メソッド数がある程度目安になると思う
適宜メソッドに分けることのできる人はそれなりにそれなりだから

読み込んで処理して整形して吐き出すCGIなのにメソッド3個とか眩暈がする
0172デフォルトの名無しさん2007/03/30(金) 17:56:37
>>135

これこそsort_byを使うべきところじゃね?
a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
p a.sort_by {|s| s[/¥d+/].to_i} #=> ["f0f", "f1f", "f2f", "f3f", "f10f"]

135のやり方だと効率云々よりも a[/¥d+/] と b[/¥d+/] と同じことを2回書いてるから美しくない。
0173デフォルトの名無しさん2007/03/30(金) 18:01:38
thenの中が4行以上ならメソッドに分ける
0174デフォルトの名無しさん2007/03/30(金) 18:05:10
俺の場合は同じ処理が二回以上出てきたらメソッドにまとめるって感じだな…
まあ小物ばっかりなんで
0175デフォルトの名無しさん2007/03/30(金) 18:07:23
>>173
お前か
引数5個で中身6行のメソッドとか平気で作ってるの
0176デフォルトの名無しさん2007/03/30(金) 18:11:13
自分の場合は完全に感覚だな…
削除処理だからそれをメソッド
表示処理だからそれをメソッド

まぁあまり一つのメソッドに詰め込みすぎるのはよくないよね。
0177デフォルトの名無しさん2007/03/30(金) 18:25:15
意味のある名前のつけられそうな処理だったらメソッドにする
0178デフォルトの名無しさん2007/03/30(金) 18:27:44
モジュール作るの積み木とかパズルみたいで楽しいよね
0179デフォルトの名無しさん2007/03/30(金) 18:28:23
ぜんぶくらすだからもじゅーるとかわかんない
0180デフォルトの名無しさん2007/03/30(金) 18:28:31
>>172
>>144
0181デフォルトの名無しさん2007/03/30(金) 18:41:54
で?
0182デフォルトの名無しさん2007/03/30(金) 18:43:04
>>180
別人だけど、なんで?メモリ?
0183デフォルトの名無しさん2007/03/30(金) 20:23:41
if文の条件式が長くなって困ってる。
Javaなんかはセミコロン打つまでいくらでも改行できるんだが
Rubyではどうやんの?

if visible==1 and visit_count==10 and ( s_member_id==1 or s_member_id==5 or s_member_id==9 )
disable = 1
end

みたいな場合。

下らん質問で申し訳ない。調べたけど案外見つけられなくて聞いてみる。
まだ探し回ってるから時々見に来ますんでよろしくです。。。

0184デフォルトの名無しさん2007/03/30(金) 20:27:41
andの後ろみたいな、明らかに式が続くことが分かる箇所では
自由に改行可能。

そうでない箇所で改行する場合は改行前に ¥ を入れておく。
0185デフォルトの名無しさん2007/03/30(金) 20:41:01
>>184
�d。できますた。
and / or 前置き派なのでハマっていたのでした。
あるいは\ね。メモメモ
0186デフォルトの名無しさん2007/03/30(金) 21:02:19
> 明らかに式が続くことが分かる箇所
へえ
0187デフォルトの名無しさん2007/03/30(金) 22:14:11
>183
catch(:hoge) do
 throw(:hoge) unless visible == 1
 throw(:hoge) unless visit_count == 10
 throw(:hoge) unless [1,5,9].include?(s_member_id)
 disable = 1
end
0188デフォルトの名無しさん2007/03/30(金) 22:28:31
>>182
破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
0189デフォルトの名無しさん2007/03/30(金) 23:21:23
久々にひどい半可通を見た
0190デフォルトの名無しさん2007/03/30(金) 23:32:22
GNU libc の memfrob(3) 関数相当の処理
http://ja.wikipedia.org/wiki/ROT13#memfrob.28.29.E9.96.A2.E6.95.B0
を行うコード書いたんですが、こんなヘボしか思いつきません。誰か助けて。
require "enumerator"
class String
def frob
self.enum_for(:each_byte).inject("") { |s, c| s << (c ^ 42) }
end
end
0191デフォルトの名無しさん2007/03/31(土) 00:01:46
self.unpack('C*').map{|c|c^42}.pack('C*')
0192デフォルトの名無しさん2007/03/31(土) 00:09:46
ところで必ずreturn書く人に聴きたいんだけど、ブロックの戻り値ってどうやってます?
最近WindowsのGUIフレームワークを書き始めたんだけど、イベントリスナをブロック
で登録できるようにしてるんだが、ブロックから値を戻すときに、returnと書くと、
LongJumpErrorとか出るんだけど。
ブロックをreturnで戻ることはできないのかなぁ。
0193デフォルトの名無しさん2007/03/31(土) 00:13:33
>>187
こんな書き方はじめてみた。
すごいのかわかりにくいのかなぞだ
0194デフォルトの名無しさん2007/03/31(土) 00:52:51
>>191
さんくすこ。メモリは数倍食うけどこっちの方が速いみたいっすね。
0195デフォルトの名無しさん2007/03/31(土) 00:54:05
>>188
>破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
あははは!sortとsort_byでベンチマークとって、自分でたしかめな。
0196デフォルトの名無しさん2007/03/31(土) 04:22:15
つ、つられないぞ!
0197デフォルトの名無しさん2007/03/31(土) 05:50:40
>>140
scanってのがあるんですね。
参考になりました。

>>177
俺もその感じ。
コメントつけるところで、むしろメソッド化

でも、Rubyだと、小物多いから、ずらって、書いちゃうことも多い
01981872007/03/31(土) 06:05:37
>>193
def hoge
 return unless @visible == 1
 return unless @visit_count == 10
 return unless [1
5
9].include?(@s_member_id)
 @disable = 1
end

begin
 break unless visible == 1
 break unless visit_count == 10
 break unless [1
5
9].include?(s_member_id)
 disable = 1
end while(false)
0199デフォルトの名無しさん2007/03/31(土) 07:42:01
>>192
メソッドの戻り値はreturnをつかうけど、ブロックの戻り値はreturnを使わない。後者は挙動が違うし。
メソッドとブロックを同じにしなきゃいけないという理由はない。
0200デフォルトの名無しさん2007/03/31(土) 11:46:49
>>195
あははは!お前こそベンチマークとって、自分でたしかめな。

% time ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }' 11.40s user 0.01s system 99% cpu 11.520 total
% time ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }'
ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }' 15.58s user 0.00s system 97% cpu 15.922 total
0201デフォルトの名無しさん2007/03/31(土) 12:24:12
3 個でソートはちょっと・・・。
しかも、ソート列をまたソートさせるのも・・・。

$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m0.950s
user 0m0.942s
sys 0m0.007s

$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort_by{|a|a}}'
real 0m0.208s
user 0m0.201s
sys 0m0.007s
0202デフォルトの名無しさん2007/03/31(土) 12:25:56
>>200
require 'benchmark'
include Benchmark

a = (1..10000).map {rand(10000)}

bm(10) do |b|
b.report("Sort") { a.sort {|x,y| x<=>y} }
b.report("Sort!") { a.sort! {|x,y| x<=>y} }
b.report("Sort by") { a.sort_by {|x| x} }
end

        user    system   total    real
Sort    1.021000  0.000000  1.021000 ( 1.142000)
Sort!    1.052000  0.000000  1.052000 ( 1.091000)
Sort by  0.070000  0.000000  0.070000 ( 0.080000)

破壊的メソッド「だから」動作が速いという理屈にはならない
単純にどれかが最強というようには決められないのがsort
0203デフォルトの名無しさん2007/03/31(土) 12:54:37
sort と sort! だと sort! の方が速いじゃん?
ごく僅かだが。
0204デフォルトの名無しさん2007/03/31(土) 12:56:31
>>202
sort と sort! を比較するなら a は毎回初期化すべきじゃない?
0205デフォルトの名無しさん2007/03/31(土) 13:02:33
$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x=x.sort{|a,b|a<=>b}}'
real 0m19.140s
user 0m19.055s
sys 0m0.060s

$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m19.130s
user 0m19.063s
sys 0m0.049s

ほとんど変わんないね。
0206デフォルトの名無しさん2007/03/31(土) 13:13:34
% time ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }'
ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }' 4.12s user 0.01s system 98% cpu 4.171 total
% time ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }' 2.70s user 0.01s system 99% cpu 2.715 total

このくらいにすると変わってくるか。
0207デフォルトの名無しさん2007/03/31(土) 13:14:29
>>204
        user   system   total    real
Sort    1.201000  0.010000  1.211000 ( 1.312000)
        user   system   total    real
Sort!    1.051000  0.020000  1.071000 ( 1.221000)
        user   system   total    real
Sort by  0.221000  0.000000  0.221000 ( 0.311000)

少なくともsort_byは使うの素人言われるほど常に遅いわけではないな
0208デフォルトの名無しさん2007/03/31(土) 13:50:31
sort_by の利点が生きるのはブロック評価が処理が重い時だろ常識的に考えて……
02091922007/03/31(土) 14:04:53
>>199
レスありがとう。普通はそうだよね。
でも俺は、returnは戻り値を明確にする意味で使っているので、ちょっと困った。
俺の癖として、最初は結構適当に書いて、ある程度動き出したらリファクタリング
するんだけど、returnがかけないと、修正したときにうっかり戻り値部分のシーケンス
をかえちゃって、気がつかないうちに戻り値が変わってバグっちゃうってことが頻繁に
あるんだよね。この手のバグは後から見つけるのが大変で。
注意して修正すればいいだけの話かもしれないが……
0210デフォルトの名無しさん2007/03/31(土) 14:08:44
リファクタリングはテストとセット。
0211デフォルトの名無しさん2007/03/31(土) 14:47:49
HTML外部ファイルにすると実行時に読み込む分遅くならないか?
.rbファイルの下のほうにHTMLだけ集めて沈めておけばおk。
0212デフォルトの名無しさん2007/03/31(土) 14:58:49
>>211
自分も前作ったCGIでは、必要なHTML部分を
パーツごとに変数に保存して置いて
必要な時に、使用出来る様にしてましたけど。
ズラズラHTMLが並ばずにソースの見通しもよくなるし。

HTMLの一部分を後で置き換えしたい場合なんかは
その部分に特殊な文字を設定したりしてましたけど。
<a href="_URL_">_STR_</a> とか。
0213デフォルトの名無しさん2007/03/31(土) 15:26:12
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換

ということを連続してやらせてるのが非常に心苦しいのでソースに直に書く
Rubyソースに一緒に書いておけばディスクアクセスは1回で済むし
0214デフォルトの名無しさん2007/03/31(土) 16:36:37
hash.has_key(hoge')?

で1時間以上詰まった
0215デフォルトの名無しさん2007/03/31(土) 16:37:30
hash.has_key('hoge')? だった

要は ? の位置
0216デフォルトの名無しさん2007/03/31(土) 16:45:24
>>213
そんな事しないしw
初心者は質問するだけにしようなw
0217デフォルトの名無しさん2007/03/31(土) 17:12:44
というか、みんなCGI書くときHTMLはどう管理してんの?
特別なフレームワークとか利用せずに、よい管理方法はなにかな?
0218デフォルトの名無しさん2007/03/31(土) 17:13:54
eruby使ってる。
0219デフォルトの名無しさん2007/03/31(土) 17:27:59
俺はRubyでは小規模なCGIばかり作ってるので
今の所はHTMLをソースに埋め込むスタイルでいいや。
0220デフォルトの名無しさん2007/03/31(土) 17:36:45
>>218
>>213の言うところの置換の塊だな
0221デフォルトの名無しさん2007/03/31(土) 19:51:26
>>217
eruby
0222デフォルトの名無しさん2007/03/31(土) 19:58:27
erubyとERBがあってerbscanとかいうのもあってどれを使うべきかさっぱりわからない
0223デフォルトの名無しさん2007/03/31(土) 21:28:54
>>217
ごく簡単なのをでっち上げるときはerbを使う。
あとコードと同じファイルの__END__以降にHTMLを書いて、
そいつを読み込んでる。ファイル一個で済むから楽でいい。
0224デフォルトの名無しさん2007/03/31(土) 21:52:25
なるほど、色々あるねえ。
0225MoonWolf ◆MoonWdLnkQ 2007/03/31(土) 22:32:18
>>222
eRubyというのがHTMLおよびテキストファイルにRubyスクリプトを埋め込む
テンプレート言語の仕様。
erubyというのが最初の実装だったかな。
あとでpure RubyのERBが出てきた。
erbscanはERBのスキャナ部を高速化するだけで単体では動作しない。
eRuby実装としては他にもerubisというのがあった。
とりあえず標準添付ライブラリのERB使っておけばいいと思う。
0226デフォルトの名無しさん2007/03/31(土) 23:03:02
>>209
ブロックってbreakで値を返せるんじゃなかったっけ?
yieldした所に値を返す場合はnextで。
0227デフォルトの名無しさん2007/04/01(日) 15:11:22
>>201-207
そもそもの発端である>>135では
> a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
> sa = a.sort{|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i }
と書いてあるから、これにそってベンチすべきじゃね?

require 'benchmark'
data = (1..10000).collect { "f#{rand(10000)}f" }
Benchmark.bm(10) do |bench|
  bench.report("sort_by") { data.sort_by {|a| a[/¥d+/].to_i } }
  bench.report("sort") { data.sort {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
  bench.report("sort!") { data.sort! {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
end


結果:
                user     system      total        real
sort_by     0.090000   0.000000   0.090000 (  0.118594)
sort        1.030000   0.010000   1.040000 (  1.154424)
sort!       1.030000   0.020000   1.050000 (  1.348342)

もう明らかにsort_byが速い。sortとsort!の差は誤差。しかもsort!のほうが悪い数値。

>>208
今回がまさにそのケースだな

>>200
これはひどい
0228デフォルトの名無しさん2007/04/01(日) 15:33:16
>>227
> しかもsort!のほうが悪い数値。

>>204
0229デフォルトの名無しさん2007/04/01(日) 15:38:34
sort!はsortのあとに呼び出してるんだから、毎回初期化する必要なんかないと思うけど?
0230デフォルトの名無しさん2007/04/01(日) 16:23:59
>>229
すまん。かんちがい。
0231デフォルトの名無しさん2007/04/01(日) 16:54:33
>>220
ああいう「文書作れるよシステム」ってのは
何か物凄いカッコイイことして生成してるんだと思ってた俺

ただの全文置換と知ったときはなんとなく失望した
0232デフォルトの名無しさん2007/04/01(日) 16:57:32
Webサービス公開してる人は勉強のためにソースも公開してる?

ソース公開しちゃうと穴突かれてレン鯖が過負荷攻撃とかされたりしそうで二の足踏んでるんだけど
0233デフォルトの名無しさん2007/04/01(日) 21:12:05
>>200すごいな 自信満々で赤っ恥かいてる
あと一日待っていれば「エイプリルフールネタでした」とごまかせたものを

今年はruby-lang.orgで何もやんないの?
0234デフォルトの名無しさん2007/04/01(日) 22:20:19
>>233
>今年はruby-lang.orgで何もやんないの?
やってるよー。よく見てみな。
0235デフォルトの名無しさん2007/04/01(日) 23:29:13
>>234
わからん・・・どこにネタが?
0236デフォルトの名無しさん2007/04/02(月) 00:17:47
もちろん>>234がネタ
0237デフォルトの名無しさん2007/04/02(月) 00:40:03
yaml使ってみようと思ったんですけど日本語が化けるのって
どうしたら直りますか?

#!/usr/bin/ruby -Ku
require "yaml"
$Kcode = "UTF8"

obj3 = {"テスト"=>"250400", "テスト2"=>"25500"}
p obj3.to_yaml(:BestWidth=>10000)

の表示結果が激しく化けます。
"--- \n\"\\xE3\\x83\\x86\\xE3\\x82\\xB9\\xE3\\x83\\x882\": \"25500\"\n? !binary \"44OG44K544OI\\n\"\n: \"250400\"\n\n"
な感じです。
環境はruby 1.8.5 (2006-12-04 patchlevel 2) [i386-linux]です。
分かる方いらっしゃったら解決方法お願いします。
0238デフォルトの名無しさん2007/04/02(月) 00:56:22
ttp://d.hatena.ne.jp/Rommy/20061229/1167406811
0239デフォルトの名無しさん2007/04/02(月) 01:09:14
>>238
そこ見てたんだが何だかうまいこと出来なかった。
んでもう一回今やったら出来ました。
ありがとです
0240デフォルトの名無しさん2007/04/02(月) 10:59:45
>>234
だまされた Σ(´д`)
0241デフォルトの名無しさん2007/04/02(月) 11:05:28
Rubyで書かれた有名なソフトってどんなのがありますか?
0242デフォルトの名無しさん2007/04/02(月) 11:16:22
特にありませんが何か?
0243デフォルトの名無しさん2007/04/02(月) 11:26:16
tDiaryとか…(汗
0244デフォルトの名無しさん2007/04/02(月) 11:53:26
ワードやエクセルみたいなのじゃないと駄目だろ
みんなが知ってるやつ
0245デフォルトの名無しさん2007/04/02(月) 12:00:38
「有名なソフト」というそのものが数少ないからな

で、ソレがあったとして、あるいはなかったとして>>241はどうするのかという話
使われなくなって廃れるのが怖いなら不滅のC使え
0246デフォルトの名無しさん2007/04/02(月) 12:08:15
あったら参考にするし
なかったら幻滅する
0247デフォルトの名無しさん2007/04/02(月) 12:18:44
しつもんです。本のデータ扱ってます。
たとえば書名と著者と出版社をキーとするハッシュがあってそれが配列に入ってます。
[
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
]

これを、出版社でソートしたあと著者でもソートしたいです。

[
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
]

どのように書くのがマトモですか?
0248デフォルトの名無しさん2007/04/02(月) 12:48:48
books.sort_by {|i| [i["出版社"], i["著者"]] } でどうよ
02492482007/04/02(月) 12:53:48
books.sort_by {|i| i.values_at "出版社", "著者" } の方がきれいか
0250デフォルトの名無しさん2007/04/02(月) 13:01:38
俺ならハッシュ使うよりも本のクラスを作って
class Book
 def initialize(書名, 著者, 出版社)
  @書名 = 書名
  @著者 = 著者
  @出版社 = 出版社
  ・
  ・
 end
 attr_reader :書名, :著者, :出版社
end
んな感じにするけどな
そうすりゃ
list = Array.new
list.push Book.new("エロ本","エロイ人","エロイ出版社")
list.push Book.new("空手入門","マス大山","ピヨピヨ空手連盟")

でソートや検索も楽になるし
0251デフォルトの名無しさん2007/04/02(月) 13:10:34
>>250
…それソート楽か?
0252デフォルトの名無しさん2007/04/02(月) 15:02:59
>>248-249
うおおおおおれにはなにやってんだかさっぱりです(w

ありがとうです勉強します
■ このスレッドは過去ログ倉庫に格納されています