1 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 17:31:07 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。) なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の 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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
698 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:58:05 ] a[0..1]みたいなのはちゃんと元のクラスにやってくれるんだよね
699 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:22:00 ] Array や String の(Cで記述した) + メソッドの定義の中で Array.new や String.new がハードコーディングされてるんだろうな 何らかのシステム的理由があるか、いまさら変更できないか、どっちかだろう まあ、バグっちゃバグかもしれん
700 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:13:02 ] >>698 むしろそっちのほうの挙動が不思議 Stringクラスの実装はCStringを知らないはずなのに、 どうしてCStringオブジェクトを返せるんだ?
701 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:28:37 ] インスタンスがあればクラスわかるから返せるにきまっとるわい
702 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:03:22 ] superのnew呼び出しでself.class.newってやるのきもくね?
703 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:10:19 ] 継承を前提としたクラスならってところ 組み込みでいえばIOとかNumericあたり というか、otherと絡むときにわざと基本クラス返してる気がするなぁ
704 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 03:07:56 ] レヴェルの低いインターネッツだな
705 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 03:22:09 ] 組み込みのくみこちゃんをdisるのはやめろ
706 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 07:06:39 ] >>703 あらゆるクラスは継承で動作可能「でなければならない」 継承したとたん動作しなくなるライブラリはプギャー
707 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 07:26:07 ] それぞれArrayを継承したFooとBarがあったとして foo + bar がどのクラスを返すべきかとか考えると >>703 の言うようにわざと基本クラスを返すのはありなんじゃないかと思う
708 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 07:31:28 ] >>707 > foo + bar がどのクラスを返すべきか 変換っぽいメソッドでない限り、通常はレシーバのクラスを返すべき つまり、foo のクラスを返すべき
709 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 07:54:09 ] このパッチをあててリビルドすればOK --- a/array.c +++ b/array.c @@ -2657,12 +2657,14 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) VALUE rb_ary_plus(VALUE x, VALUE y) { + VALUE klass; VALUE z; long len; y = to_ary(y); len = RARRAY_LEN(x) + RARRAY_LEN(y); - z = rb_ary_new2(len); + klass = rb_obj_class(x); + z = ary_new(klass, len); MEMCPY(RARRAY_PTR(z), RARRAY_PTR(x), VALUE, RARRAY_LEN(x));
710 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 08:07:52 ] 本当にそのほうがいいと思うなら、 redmine.ruby-lang.orgにfeature request投げとけば。 個人的には、両方のクラスが同じときだけにすべきじゃないかと思うが。 あと2chに初出のコードは著作権的に取り込むのは危険なんじゃなかったっけ。
711 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 08:22:54 ] >>710 危険というか取り込み不可能 というか別にそんなことを意図したコードでもあるまい お前空気読めないと周りから言われるか全く何も言われないかどっちかだろ
712 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 08:50:19 ] 無理矢理ねじ込んだ感バリバリの3行目に ドカタのストレスを見た。
713 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 08:56:26 ] 言われるか言われないかのどっちかワロタ
714 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:27:56 ] 質問です;; mvcモデルをつくりたいのですが、下記エラーが出て削除機能が使えません undefined method `destroy' destroyが使えない?? newもfindも使えるのに・・ 解決法知ってる方いたら教えてください
715 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:40:02 ] MVCと直接関係ない質問に見えるけど何の話?
716 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:45:48 ] 要するにdestroyメソッドを使う方法がわからないです
717 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:47:12 ] destroyメソッドってなに?
718 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:49:12 ] すいませんここはrailsは対象外なんですかね・・ 他当たってみます
719 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:51:30 ] >>718 RailsならRailsと言え。 MVCってのはRails固有の概念ではない。 あと、 【Ruby】Ruby on Rails Part8 pc11.2ch.net/test/read.cgi/php/1252842574/
720 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 16:33:54 ] undefined method `destroy'の後が重要だったりするんだよな
721 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 17:12:32 ] >>720 この場合はいいえ
722 名前:714 mailto:sage [2009/10/11(日) 01:00:33 ] >>721 何か知ってる事あったら教えてもらえますか?
723 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 01:07:07 ] うざ
724 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 11:59:17 ] PStore.dump してファイルに保存済みのデータがあったとし a = nil PStore.new(...).transaction do |c| a = c[:data] # Array や Hash がネストしたデータ(shallow copy では完全にコピーできない) end x = a[...][...].XXX[...] というように PStore.transaction の外で読み込んだデータ を使っても問題ないものなのでしょうか。 内部的には Marshal.load しているということなので、問題 ないような気もするのですが、ドキュメントの記述を見ると そういう使い方していないようなかんじなので…。
725 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:02:25 ] Marshal.dump は唯一、標準ライブラリで深いコピーを行う
726 名前:724 [2009/10/11(日) 12:16:24 ] なるほど >>725 さん PStore が Marshal 上に実装されているという前提が変わらない限りは PStore#transaction の外にデータを持ち出しても問題ないわけですか これまで無駄に transaction の内部にコード入れていたので書き直そう…。
727 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:20:45 ] >>724 PStore#transactionは、 * 同じデータファイルに対する他のPStoreアクセスを禁止している (読んでる間に書き換えられないように) * ブロック処理がabortされなければ、変更の再ダンプを行う。 という感じの仕事をしている。 中で読んだデータはそのままメモリにある。ブロックを出たあと、 誰かがデータファイルを書き換えたとき、それとメモリが一致しな いということを認識した上でなら問題ない。
728 名前:724 mailto:sage [2009/10/11(日) 12:43:24 ] まさにそのあたりが気になっていた(transaction 抜けたら参照している データがメモリ上から消えちゃう可能性があるのかなあ、とか)のです、 明快な説明どうもありがとうございました >>727 さん
729 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:19:20 ] きちんとトランザクションって書いてあるだろ トランザクション抜けたからって取得データ本体が消えるなんてことはそもそも …実装としてありそうな気もするな トランザクション有効中に明示的に複製してクダサーイというのはアリではある んで、PStore#transaction は普通は File.open のようにブロック範囲を限定して使う データを取得または保存する瞬間にだけ、トランザクションに入る 何らかの理由で複数回アクセスしたいという場合は、PStore.new のオブジェクト自身を変数で保持する なお、 PStore は、実装の都合上「ファイル全体を最初から最後まで必ず読み込む」ので注意 変更部分に対応したファイルの一部分だけを書き換えるとか、そういう細やかな小細工は通用しない データの大きさと更新頻度によっては複数に分けたほうが負荷的にお得
730 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:36:09 ] WinでAutoHotKeyの代わりに使える機能を完備してあるライブラリってない?
731 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:56:05 ] 繰り返し処理で正規表現を使う場合 a.each do |b| print "match" if c =~ /hoge/ end よりも reg = Regexp.new("/hoge") a.each do |b| print "match" if c =~ reg end の方がいいでしょうか?
732 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:05:15 ] そういうのは正規表現の中に変数を含む場合です
733 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:12:35 ] 変数を #{} などで含まない「固定」の正規表現は1回しか生成されない 1.upto(10000).each do /h/ =~ "hoge" end でも re = /h/ 1.upto(10000).each do re =~ "hoge" end でも、Regexp のインスタンス生成は1回だけ つまり、処理速度や負荷的には実質どちらでも構わないし、 厳密にはブロックの外の変数を参照するコストのぶんだけ後者が遅い
734 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:34:33 ] >>732-733 なるほど、ありがとうございます
735 名前:724 mailto:sage [2009/10/11(日) 22:15:19 ] RDBを使うほどでもないけどちょっと中間データをファイルとして永続化して おきたい(けどCSVファイルなんかは表現力が弱いので嫌な)ときに、素で Marshal.dump/load するより楽なので PStore を使っていたのですが PStore#transaction でデータ処理全体をブロックする必要があるのかないの か「実装としてありそうな気もする」ので気になっていたので、たいへん勉強 になりました、どうもありがとうございます >>729 さん
736 名前:デフォルトの名無しさん [2009/10/12(月) 19:03:31 ] rand()の範囲を指定したいのですが 10から20の間の数をランダムに発生させたいというばあい rand(10-20)とか直接与えることは出来ますか?
737 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:13:37 ] 0から10の範囲の乱数を発生させて10を加える。
738 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:18:20 ] >>737 が正解
739 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:21:25 ] 俺俺ライブラリに class Range def rand Kernel.rand(last-first+1)+first end end ってやっといて (10..20).rand するとか 標準じゃ無理
740 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:29:25 ] (10..20).to_a.sort_by{rand}.first
741 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:39:58 ] >>740 短いのですがどうもちゃんと動作しないようです。 (1..2**30).to_a.sort_by{rand}.first としましたが、結果がかえってこないのであきらめました。
742 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:07:39 ] >>741 そりゃ単に重すぎるだけだ 要素数が2**30の配列を作ってるんだから そこまで大きな数を扱うのなら、小手先なしでrandした方がいいよ
743 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:08:59 ] だから>>737 以外は実用妥当な乱数にならねえって
744 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:09:56 ] スレタイ100回読んで半年ROMっとけ
745 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:15:49 ] 乱数発生部は組み込みに任すのが完全に正しい姿だな 累乗とか使って結果的に偏らせるのも成長段階には必要という説もあるが
746 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:17:49 ] 最近/.並にゴミで埋まるようになってきたなここ。
747 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:23:23 ] >>746 2chも大差ないだろ
748 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:24:39 ] >>746 斬新な自己紹介ですね
749 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:40:35 ] こういうありきたりなループの終了条件に !=を使うのは普通ですか? count = 1 end_count = 10 while count != end_count puts count count = count + 1 end
750 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:44:09 ] へん
751 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:48:03 ] (1...10).each {|i| puts i} じゃだめなん?
752 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:50:22 ] count が増えるとは限らないのだろ loop do break if count == end_count ... end せめて break して欲しい
753 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:08:18 ] >>752 何でbreakの方を推すの? 横から見てもいまいちわからん 普通ここは、読みやすいuntilを推す流れじゃないかと思うんだけど
754 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:15:49 ] あまり使わないんですね。 気をつけます。ありがとうございます。
755 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:18:26 ] あまり使わないのか? 場合によりけりで特に使う使わないを気にする記述でもないと思うんだけど
756 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:21:14 ] >>740 単に非効率なやり方だろ 他人に教えるようなものじゃない
757 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:29:55 ] C++のSTLのイテレータに慣れてるとそう書きたくなるな。
758 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:33:38 ] 読みやすい until などというものは存在しない と思う