[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 21:32 / Filesize : 199 KB / Number-of Response : 759
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 31



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 などというものは存在しない
と思う






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef