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


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

Ruby 初心者スレッド Part 23



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

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で開くとコケるみたいです。
どんなファイルのときにこけているか分かれば対策の打てるような気もします。

256 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:20:24 ]
テンプレ。
>質問には以下を書くこと。へたくそな質問は再提出を要求される。
> ・エラーメッセージ(自力で訳さずなるべくそのままで)

エスパーしてみると、エラーを突っ返されても構わずREXML::Document.newに渡しているせいで
XMLとしては当然解釈できずパースエラーとか。

257 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:32:51 ]
>>255
>result = open(a2)

a2 が何かしらんけど、open() が返すのはFileオブジェクトじゃないかな。
だから
result = open(a2) {|file| file.read }
とか
file = open(a2)
result = file.read()
file.close()
とかすればいいんじゃないかな。

258 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:22:33 ]
>>257
そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ

259 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:35:54 ]
そんな煽りいらないお

260 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:56:35 ]
俺らは質問やその後の遣り取りから質問者の知識を当て推量して回答したりしなかったりするわけだが、
>>258と言いたくなるのは今回は仕方があるまい
openを一度でも自分で使ったことがあるならわかることだからな
書き込みの際に省略してるだけだと思うしかないわ

261 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:46:03 ]
> open命令でXMLファイルをサイト経由で取得した場合、
openつーか、require 'open-uri'した上でのopenだよな?


262 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:58:18 ]
>>260
君はキモイからもうこのスレに来なくていい



263 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 09:46:33 ]
>>262
お前キモいな

264 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 10:03:51 ]
262はもうこのスレに来られなくなりました。






[ 続きを読む ] / [ 携帯版 ]

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

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