1 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:30:21 ] プログラミング言語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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
155 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:45:27 ] >>153 そもそも2重evalで何がやりたいのかを詳しく そのサンプルコードでは、意図がよく分からない
156 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:03:12 ] それはさすがに見たままなんじゃね def hello(person) return eval("Hello, #{person}") end という。eval文の入ったメソッド定義そのものをeval文で書きたいのだろ
157 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:05:29 ] EOSは何もくくらないと、"EOS"と同じ扱いになる つまり文字列全体をダブルクオートでくくったのと同じ状態になるので、展開が起きる 外側のevalに渡された文字列を評価する時点で#{person}が展開されちゃって、変なことになってる 展開を抑制するのが楽な回避法。'EOS'とすべし helloメソッドは文字列を返したいのかもしれないけど、 それだと内側のevalにも括弧が足りない eval <<'EOS' def hello(person) eval %q[ "Hello, #{person}!" ] end EOS print hello("Ruby") # => Hello, Ruby!
158 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:08:58 ] それは展開されないと困るんじゃないかなあ 変数展開がないならメソッド定義をevalで書く必要なくね?
159 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:41:34 ] rubyでnet/sshを使おうとしてるのですが、標準入力の使い方がわかりません それっぽいのがここしかないけど webos-goodies.jp/archives/51357031.html 他にないですか? やりたいのはsshで他サーバーに接続して、suでパスワードを入力し、 grep + パラメータを実行しその結果をブラウザに出力したいです 初めてrubyを使って無謀なことをしてる気もしますが、標準出力はどうにかなりましたが、 入力がどうもうまくいかず net/sshのリファレンスページもみましたがいったいどこを探せばメソッド載ってるのかわからない です
160 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 20:05:45 ] >>159 net-ssh.rubyforge.org/ssh/v1/chapter-5.html rubyforge.org/forum/message.php?msg_id=32802
161 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 22:56:25 ] >>160 うおおありがとう!まさに求めていた物だ!
162 名前:デフォルトの名無しさん [2008/12/04(木) 07:14:05 ] Rubyで書かれたblog用のCGIってないですか?
163 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 07:21:24 ] >>162 その質問には、熟慮の末に「ない」と答えるのが妥当な気がする
164 名前:デフォルトの名無しさん [2008/12/04(木) 07:25:21 ] >>163 ということは、あるにはあるけど使えないとか、そんな感じですか?
165 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 07:25:57 ] 「ぶろぐようのしーじーあいありますか?」という質問に応えられるレベルのものはないな 素直にPHPかPerlの使っとけ
166 名前:デフォルトの名無しさん [2008/12/04(木) 08:37:00 ] >>165 一応名前だけでも教えてください。
167 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 09:48:40 ] >>162 tDiary、Pinky:blog、lily もしかして普通に名前挙げた俺、空気読めてない?
168 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:00:59 ] 「ぶろぐようのCGI」というものを求めてる人には結構アレなシロモノだと思う Rubyをやりたいんじゃなくてブログシステムが欲しいんだろうし
169 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:16:04 ] tDiaryより設置しやすく使いやすい軽快なものを作ろうとしてるのかもしれないじゃないか 日本における Perl の隆盛は Perl でカウンタと掲示板が作られたことだからな 「なんかごっつい Rails だけじゃない Ruby」を推進するなら今しかない
170 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:52:08 ] >>158 はい。 ['hello', 'goodbye'].each do |greeting| eval(EOS) def #{greeting}(person) eval "#{greeting.capitalize}, #{person}!" end EOS end 実際はこんな感じです。展開抑制されると思わなかったので…
171 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 18:56:49 ] 2重にしてでもevalを使いたいのは、リフレクションで トップレベルにメソッドを定義するため?
172 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 21:28:23 ] >>170 ふつーはこう書く ['hello', 'goodbye'].each do |greeting| eval(<<-EOS) def #{greeting}(person) '#{greeting.capitalize} %s!'%person end EOS end
173 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:24:58 ] 採点用プログラムを書いてるんですが、得点ごとの振り分けでちゃんと動きません。 【ちゃんと動くプログラム】 if 90<=tokuten ; foo[9] += 1 ; end if 80<=tokuten && tokuten<90 ; foo[8] += 1 ; end if 70<=tokuten && tokuten<80 ; foo[7] += 1 ; end if 60<=tokuten && tokuten<70 ; foo[6] += 1 ; end if 50<=tokuten && tokuten<60 ; foo[5] += 1 ; end if 40<=tokuten && tokuten<50 ; foo[4] += 1 ; end if 30<=tokuten && tokuten<40 ; foo[3] += 1 ; end if 20<=tokuten && tokuten<30 ; foo[2] += 1 ; end if 10<=tokuten && tokuten<20 ; foo[1] += 1 ; end if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end 【上記では長いのでイテレータで短くしたプログラム(正しく動かない)】 (1..8).each do |i| if (90<=tokuten && tokuten<=100) ; foo[9] += 1 ; end if (i*10)<=tokuten && tokuten<(i+1)*10 ; foo[i] += 1 ; end if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end end 配列はちゃんと0で初期化してあります。 短くしたプログラムはfoo[9]以外はちゃんと動いてるみたいです。 foo[9]だけが明らかにおかしい人数になるので不思議です・・・ なんとなくかっこで囲んでみたけどダメでした。もちろん上記と同じように「90<=tokuten」も試しましたがダメでした。 助言お願いします。
174 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:42:43 ] foo[9] += 1の行とfoo[0] += 1の行が8回も実行されてるからイテレータの外に出す それか1..8を0..9にして、10点未満も90点以上もiの一般式に組み込むかのどっちか
175 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:44:23 ] うおー、初心者スレっぽいぞ 頭が痛くならない解決法のひとつは、case文を使うこと case tokuten when 90..100 then foo[9] += 1 when 80..89 then foo[8] += 1 when 70..79 then foo[7] += 1 # 中略 when 10..19 then foo[1] += 1 when 0..9 then foo[0] += 1 end もうひとつは、得点とカウンターの関係を冷静に見て条件を抽出すること。 「得点の 1 の位に等しい配列要素を +1 する」 「ただし、100 点の場合は 9 要素目を +1 する」 「なお、9 を 10で割ると 9 /10 = 0 である」 if tokuten == 100 then foo[9] += 1 else n = tokuten / 10 foo[n] +=1 end
176 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:55:13 ] >>175 >うおー、初心者スレっぽいぞ たしかにな >「得点の 1 の位に等しい配列要素を +1 する」 10の位の間違いか? >「ただし、100 点の場合は 9 要素目を +1 する」 これはひっかかりそうだなー コードはもうちょっと簡潔になるな。 n = tokuten == 100 ? 9 : tokuten / 10 foo[n] += 1 または if tokuten == 100 n = 9 else n = tokuten / 10 # ex. 85 -> 8, 31 -> 3 end foo[n] += 1
177 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 13:27:46 ] >「ただし、100 点の場合は 9 要素目を +1 する」 こういう条件にするとそう処理する理由がそれほど明らかでない。 条件は上界により与えられるとして考える方がよくないか。 いつぞやRubyスレで話題になった Range#bound があれば idx = (0..9).bound(tokuten / 10) foo[idx] += 1
178 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 13:38:10 ] まあ落ち着いてスレタイ100回読め
179 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 13:40:50 ] ンなこと言ったらデータとしては foo[10] を作るのが自然 100 点に関しては集計なり統計なりするときの処理に扱いを委ねるべきで、 データの時点で組み込んでしまうべきではない
180 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 13:55:20 ] >>173 >>174 も書いてるがその「正しくないコード」の意味するところは、 i を 1 から 8 に変更しつつ do 〜 end の中のコードを実行するという事だ。 foo[9] 以外は動いているって言ってるけど foo[0] にも同じ問題がある。 「do 〜 end 中の文は tokuten の値が何であろうと 8回実行されてる」 という事を頭に入れてもう一度コードをよくみて考えてみて。 多分上手く動いていると思っている部分も、あまりよくないと気付くだろう。
181 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 13:58:12 ] eachは「振り分け」じゃないからな 時々混乱したことはあった
182 名前:173 mailto:sage [2008/12/05(金) 14:17:41 ] >>174 ,180 その通りですね。脳内で考えたときは一度条件に当てはまったら勝手にeach文から抜けてました・・・ >>175 case文だと元のfor文と対して長さが変わらないですねw もう一つの案、とても参考になりました。ありがとうございます。 >>176 条件演算子、思いもつかなかった方法です。 短くて使いやすそうです。ありがとうございます。 >>177 む・・難しい・・・ コピペしても動かなかったので何か読み込ませるものなんですね。 レスくれたみなさま、ありがとうございました。 得点を割ってそのままインデックスとして使う方法は私にとっては斬新で勉強になりました。 重ね重ね、ありがとうございました。
183 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:26:56 ] >>173 なあ、初心者にちょっと聞いてみたいんだけど、条件演算子って難しい? n = tokuten == 100 ? 9 : tokuten / 10 とか理解できる? 世の中には条件演算子を禁止するようなプロジェクトがあって、頭おかしいと思ってるんだけど、 初心者にとっては条件演算子がほんとうに難しいのかどうか気になる。
184 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:30:16 ] 条件演算子が禁止されるのは、難しいからと言うよりも 乱用されてソースコードが酷いことになるのを防ぐためじゃない?
185 名前:rubyの初心者 mailto:sage [2008/12/05(金) 18:34:24 ] n = 9 if tokuten == 100 else tokuten / 10 のほうがわかりやすい。
186 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:44:57 ] >>185 おまえ、rubyの初心者じゃなくてPython上級者だろ。
187 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:50:36 ] 条件演算子の禁止は「難しいから」じゃない 難しいという理由からなら、こんなに一般的に禁止が広まるわけがない
188 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:55:02 ] rubyには?で終わる述語が覆いから sym = n.zero? ? :hoge : :fuga とかやられるとわけがわからない。 sym = if n.zero? then :hoge else :fuga end ほらわかりやすい。
189 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:56:29 ] ネストすると読みづらいからじゃないかな
190 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:57:55 ] 三項演算子(条件演算子、注釈逆か)は、下手に許可すると 変なとこで改行してカッコつけてネストする奴が出てくるのが嫌われてる理由の一つだと思う そんなに複雑なら if 文で書くかリファクタリングしろ
191 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 19:02:21 ] 記号が小さくて読み落とししやすいんだよな もっと2〜3文字のキーワードで区分けされていると読み落としがないんだが
192 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 19:05:21 ] Ruby は if 文が値を返すから、三項演算子の必要性は他の言語よりも薄いと思う
193 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 19:18:32 ] 書く分には良いんだが、読みにくい印象が強いな <<三項演算子
194 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 19:28:41 ] >>188 >sym = n.zero? ? :hoge : :fuga >とかやられるとわけがわからない。 そうか、初心者はこの程度でもわけがわからなくなるのか。 >sym = if n.zero? then :hoge else :fuga end >ほらわかりやすい。 どこがだよ。
195 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 19:45:21 ] >>193 条件演算子で短くまとめた条件分岐はほぼ100パーセントの確率で のちのち長い if 文に書き換える羽目になるというのがどうにも 嫌われる人はここで条件演算子使用を強行する
196 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 20:00:26 ] 最初から then 書くのがけっこう普通になるよね
197 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 20:22:43 ] 1行で書けて式の値を使うときだけ三項演算子 ifの返す値を使うプログラムは読みにくい
198 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 21:21:19 ] 配列の添え字アクセスを send で行うことはできますか? [1, 2, 3].send("[](1)") が 2 を返すような
199 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 21:23:20 ] [1,2,3].send('[]', 1)
200 名前:173 mailto:sage [2008/12/05(金) 21:26:57 ] >>183 条件演算子が難しいなんて書いてませんよ・・・私・・・ n = tokuten == 100 ? 9 : tokuten / 10 「tokuten」が100ならば「9」を「n」に代入、elseなら「tokuten/10」を「n」に代入ですよね
201 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 21:32:06 ] >>199 うおー引数2個ーめんどー ありがとうございます
202 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 22:12:43 ] >>200 アー、悪い、 >条件演算子、思いもつかなかった方法です。 って書いてあるから、初心者には理解するのが難しいのかと思った。 わかってるならすまんかった。気を悪くせんでくれ。
203 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:23:58 ] RubyってJavascriptの代わりになりますか?
204 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:29:54 ] なりません。
205 名前:デフォルトの名無しさん [2008/12/06(土) 01:40:02 ] すんません、 メソッド呼び出しているだけの行で [BUG] Segmentation faultってバグ落ちしたメッセージが表示されるですけど、 これってどこでバグっているのか原因わかりますか? 後、ルビーのバグ回避のプログラミングの仕方ってあるでしょうか? ルビーの落とし穴というページ見ても今一バグが発生する原因や回避の方法が分からないもので。
206 名前:デフォルトの名無しさん [2008/12/06(土) 01:42:36 ] 追記です。 ルビーのバージョンは1.8.6で無料サーバでつかうため、パッチやバージョンアップ以外の方法でバグ回避方法をおしえてください。
207 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:44:16 ] 実際のスクリプトの部分を見せることができないのは村の掟とかそういうのなんですよね
208 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:44:39 ] >>205 ruby本体のbugだから、まずは最新版で試してみて。 それでも再発するなら、出来る限り余分な部分を削った再現コードを作って ここか本スレかruby-listに晒せばおk。そのときruby -vの提示を忘れずに。 あとは偉い人がよろしくやってくれるはず。
209 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:47:13 ] >>206 ・・・まあ再現コード見せて。 そのコードを作ること自体が「回避の方法」だったりするし。
210 名前:デフォルトの名無しさん [2008/12/06(土) 01:58:16 ] コードは晒せないですが、 openでファイル作成やREXML::Documentとグローバル配列とメソッドだけでね。 今やったらなぜメソッド中の注釈「# DATAURL 」の行を指して [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] って出ました。わけわからん。
211 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:00:28 ] 無料サーバであいさんはちろくえむえすうぃんさんじゅうに?
212 名前:デフォルトの名無しさん [2008/12/06(土) 02:05:23 ] >>211 RDEでデバッグしながらですがけど... 鯖だとデバッグできないですから..
213 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:18:57 ] >>210 再現コードがないと、なんともコメントできない。
214 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:19:25 ] うむ
215 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:19:34 ] 村の掟ワロタ
216 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:52:30 ] コード晒せないのなら諦めろ、あるいは自力で解決しろ Segmentation faultだけでは、アドバイスする側にもわけわからん
217 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 02:53:36 ] gdb coreして、whereだ。 何かが分かる気はしないけどね。
218 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 08:57:37 ] 未知か既知かわからないRuby本体のバグを誰かがわからないけどどっかで踏んでる、ということだな それ以上のことはなんもならん
219 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 10:53:07 ] セグフォはRubyのバグだから投稿すれば本来治してくれるんだけど 再現コード無いのは無理だなあ
220 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 14:02:12 ] リファレンスマニュアルの終了処理に、「exit(3) で終了」って書いてあるけど、なぜ 3 なんですか?ただの例?
221 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 14:11:45 ] >>220 0は成功、1かそれ以上は失敗 ということで、ただの例ですな
222 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 14:18:02 ] >>220 exit(3)の3はmanのセクション番号でライブラリコールだってこと。 詳しくはman man 他にもwrite(2)とかがある
223 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 14:19:29 ] >221 多分それ違う >220 exit(3) のリンク先を見れば判ると思うけど、この exit はC言語の関数の exit() のこと。 要はRubyが内部でやってる処理を説明している。 Linuxのマニュアルのセクション3にあるexit()の通りの処理をしてるよ、という意味。
224 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 15:51:10 ] マニュアルにある exit(3) の (3) は引数を表してるわけじゃないんですね。 >>221-223 ありがとうございました。
225 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:25:24 ] >>204 なんでだよ Rubyってなんでもできる万能言語って聞いたんだが
226 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:30:20 ] >>225 ではその人を責めてください サンタクロースが実在しなかったからといってサンタ役のお父さんをバシバシ叩くのはやめてください
227 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:22:34 ] >>225-226 ワロタw
228 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 23:51:21 ] エクセルをRubyで動かしたいんだけど、OLEが分からないからエクセルのマクロスクリプトを Rubyのプログラム上からエクセルに渡して動かす、みたいなことはできますか?
229 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 00:35:40 ] エクセルオブジェクトにそういう機能があれば、 呼び出す側の言語が何であろうと出来るんじゃない?
230 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 00:37:45 ] てかエクセルオブジェクトを使うにはOLEの知識がいるじゃないか。
231 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 06:28:28 ] メソッドの勉強してるんですが puts とか getsがメソッドですよといわれたのは良いんですが self.puts とか、 100.to__s とかはわかるのですが gets.chompはなぜgetsの後ろにchompが付くんですか? メソッドの前に付くのが普通だと思ってたので・・・
232 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:14:23 ] >231 self.gets.chomp getsの結果に対してchompするということ つーかgetsはレシーバ書かないほうが普通だと思うが…
233 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:36:31 ] >>232 ありがとうございます selfは書かないんですけど rubyの練習に読んでる www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=05 でselfが出てきたので聞いてみました。
234 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:50:48 ] そこ「説明の切り捨て方」がイマイチだな メソッドチェーンという概念がある(あくまで概念で、文法のようなものではない) あるメソッドの返り値のオブジェクトのクラスのメソッドを 返り値を返すメソッド.返り値のクラスのメソッド で動作させるものだ 関数的メソッドgetsの返り値は文字列であるStringクラスのオブジェクト(=インスタンス)だから、 Stringクラスのメソッドであるchompをメソッドチェーンで記述できる あくまでメソッドの返り値(またはオブジェクトそのもの)のクラスが重要 返り値のクラスは常に意識しておくといい
235 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:31:30 ] >>231 >gets.chompはなぜgetsの後ろにchompが付くんですか? s = gets s.chomp を一行でかいたら gets.chomp になった、というだけのこと。
236 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:38:01 ] >>234 難しい・・・(>_<) >>235 なるほど
237 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:53:23 ] Rubyはかなり豪快なメソッドチェーンが出来るのが魅力だよな 何だかんだでチェーンが切れるOOPLは多い気がする
238 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 09:01:12 ] end の後ろにメソッドが平気で繋がるのはやりすぎだとも思える が、ブロックとして {} を使うことにすると、クラスとメソッド用途によっては異常に便利 self や目的のオブジェクトが意図的に返るように作られてるブロックつきメソッドが多いのが効いてるな def … ナントカ カントカ yield s if s s end という定義が多い
239 名前:205 [2008/12/07(日) 17:03:10 ] すいません、あれから色々と調べて最初配列の作りすぎてメモリ使用しすぎて落ちているのかと思ったのですが、それともちがったようです。 それで現在も分からないですが、エラーメッセージの一番大事な所を表示し忘れました。 これで何が原因かおおよそわかりますか? C:/Ruby/lib/ruby/1.8/rexml/text.rb:312: [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. Complete(3) 最初自分の命令の312行かと思い込んで読んでいたのですが、よくみるとREXMLの中の312行で死亡したぽいですが。
240 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 17:28:44 ] >>239 >>213-219 だれも「詳細なエラー文を」とは言ってないんだ。
241 名前:205 [2008/12/07(日) 18:03:35 ] それでは質問を変えます。 C:/Ruby/lib/ruby/1.8/rexml/text.rb:312 このエラーメッセージが意味するのは私のかいたプログラムの312行でエラー発生したのではなくて、 ルビー側が用意している C:/Ruby/lib/ruby/1.8/rexml/text.rb の312行目でエラーが発生したと解釈して間違いないですよね?
242 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:38:00 ] >241 それも完全な間違いでは無いが、限りなく間違いに近い。 本来Ruby側はどんな間違ったコードでも 「Rubyの」エラーを出して、コードとしては異常な終了でありながら Rubyとしては正常に終了しなければならない。 ところが今回RubyはSegmentationFault…つまりRuby自体が異常な終了をしている。 だからRuby制作側としてはRubyを修正すべきなんだが そのためにはSegmentationFaultが起こる状態を再現しないと 根本的な修正が難しい。 だから、その同じ状態を再現するコードがあったほうが良いのだよ。 …で、ライブラリ由来だとしてもライブラリをどう使うと起こるのか判らない。 SegmentationFaultである限り、貴方に責任はほぼ無いが 修正するには再現コードがないとキツいだろうなあという話。
243 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:42:43 ] ああ、C製の外部ライブラリなんかもセグフォで落ちるか? どちらにしろセグフォ起こす時点で 貴方自身では勘ぐらいしか対抗手段は無いよ。 で、実際のコードも再現コードも出せないなら 作者も多分修正不能で「原因不明のバグ」としか言えない。
244 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:44:40 ] 「[BUG]」を吐いて落ちてるような場合は、インタプリタが具体的に 「ここの行が悪いんでエラーにしますよ」と言ってるわけじゃないから、 その「C:/Ruby/lib/ruby/1.8/rexml/text.rb:312:」はたいした情報にならない。 問題を起こすプログラムから、そこを削っても問題が同じように起こる場所は 全部削っていって、問題を起こす最小のセットを作るしか、Rubyを作ってる 側としても対処のしようがない(普通は)。 (たまに、実は把握済みの問題で「このパッチだよ」というのが出てくることも あるがそれは宝くじのようなものなので)
245 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:45:26 ] >>241 情報が少なすぎて判断出来ないし、ここでやる内容とも思えない 問題のソースとエラーメッセージの全てを出して作者に聞け
246 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:45:35 ] 最新版が使えるなら最新版にしたら直ってるかも知れない。 最新版が使えないなら原因がネット上に落ちてるかも知れない。 …で、ネット上探すのは再現コードを見れないと厳しい。
247 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:10:06 ] >>239 とりあえずコードが公開可能なものならどこかのアップローダーに公開すれば いいわけで…。公開不可能ならMatzにそのソースを送りつければいいや。 ちなみに現在の最新安定版は1.8.7-p72だからそれを導入してみて もう一度やってみれば?もしそれでもSegmentation Faultが出るなら もう一度ここに来て。 Rubyの公式サイト www.ruby-lang.org/ja/
248 名前:デフォルトの名無しさん [2008/12/07(日) 20:53:45 ] >>242 おまえはキモイな。rubyなんかやるよりも死んだ方がいいんじゃないか?どうせ友達なんかいないんだろw
249 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:58:18 ] ルビー使い自称ルビリスト(笑)なんて所詮は囚人程度の脳味噌しかないからあまり関わんないほうがいい
250 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:14:00 ] >>248 ロジックで敗れたのでヒステリーで対抗ですね、わかります。
251 名前:デフォルトの名無しさん [2008/12/07(日) 21:20:15 ] >>249 そのようだなw
252 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:49:47 ] >>248 そんなカキコミしてる暇あったら、再現コードを用意しようぜ。 SegmentationFaultのバグは、再現コードがないとエスパーしようがない。
253 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:03:56 ] おまえらけんかすんなよ
254 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 23:37:37 ] 1.8.5ででかいのをREXMLに食わせたらSEGVったって話が 結構前にruby-devにあったような。
255 名前:デフォルトの名無しさん [2008/12/08(月) 03:09:02 ] 度々すいません。 open命令でXMLファイルをサイト経由で取得した場合、 result = open(a2) resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、 帰ってきたサイトのHTMLデータといいますか、そのようなものを見るにはどうしたらいいのでしょうか。 色々とテストしてみたら、どうも帰ってくるXMLデータが相手サーバの都合か何かで変な状態で返されものを REXML::Document.newで開くとコケるみたいです。 どんなファイルのときにこけているか分かれば対策の打てるような気もします。