Ruby 初心者スレッド Part 40
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/12/11(土) 15:46:15★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。
関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0951デフォルトの名無しさん
2011/02/08(火) 15:23:160952デフォルトの名無しさん
2011/02/08(火) 15:52:38自分でStopIteration例外を補足する必要があります
カウンター付きloopの提案
引数つけたときだけカウンター回せばいいんじゃないだろうか
これなら既存の使い方のパフォーマンスも落ちないはず
ついでにEnumeratorも生成できれば便利なのでは
引数は succできるやつとEnumeratorのみ受け付けれられればいいかな
でも、名前がだめだめなのでまったく採用の見込みは無さそう
loopにはカウンターをまわすイメージが無いので
0953デフォルトの名無しさん
2011/02/08(火) 15:54:52def loop(counter = nil)
raise TypeError unless counter.nil? or counter.respond_to?(:succ) or Enumerator === counter
return enum_for(:loop,counter) unless block_given?
case
when counter.nil?
orig_loop{ yield }
when Enumerator === counter
orig_loop{ yield counter.next }
when counter.respond_to?(:succ)
orig_loop{ yield counter; counter = counter.succ }
end
end
limit = 5
i = 0
loop(1){|n| p n; break if (i+=1) >= limit}
i = 0
loop('a'){|n| p n; break if (i+=1) >= limit}
i = 0
loop((1..3).each.cycle){|n| p n; break if (i+=1) >= limit}
endless_counter = loop(0)
0954デフォルトの名無しさん
2011/02/08(火) 18:13:02loop.with_index{|_,i| p i }
とかできるんだなw初めて知った
0955デフォルトの名無しさん
2011/02/08(火) 18:49:36サーバ(CentOS5)のRubyが1.8.5だったときの絶望感ったらないね。
0956デフォルトの名無しさん
2011/02/08(火) 18:50:35どういう仕組みなの?それ
0957デフォルトの名無しさん
2011/02/08(火) 19:13:42おおー、ブロックなしだと、Enumeratorを返すようになったんだ。
0958デフォルトの名無しさん
2011/02/08(火) 20:05:33[nil].cycle と同じだし
p loop.take(5) #=> [nil, nil, nil, nil, nil]
p [nil].cycle.take(5) #=> [nil, nil, nil, nil, nil]
無限nil列って使い道あるのか?
with_indexしたところで、余分なnilが付いてくるし
0959デフォルトの名無しさん
2011/02/08(火) 20:41:56おいやめろ
0960デフォルトの名無しさん
2011/02/08(火) 22:57:000961デフォルトの名無しさん
2011/02/08(火) 23:13:390962デフォルトの名無しさん
2011/02/09(水) 01:05:19初期値を比較的安全に設定するために、指定された初期値を dupして代入しようとしましたが、
初期値が数値などの場合 dup で例外が発生します。
respond_to? でdupできるかどうか判別できるかとも思いましたが、dup できなくても true が返ってきます。
今は仕方がないので例外を捕捉して例外時はそのまま代入していますが
0963デフォルトの名無しさん
2011/02/09(水) 01:40:36xml = open(headline_url)
aa = REXML::Document.new(xml).root
このコードでxmlに<とか>が入ってるとパースエラーになってしまうんですがどうすればいいでしょうか
0964デフォルトの名無しさん
2011/02/09(水) 02:18:26ねとらじの運営にゴルァするのがベストかと
well-formedなXMLを送ってこいと
0965デフォルトの名無しさん
2011/02/09(水) 02:27:09xmlの必須要素である<>があるとエラーなんて、ライブラリとしてあってはならないバグだ
即刻バグ報告すべき
0966デフォルトの名無しさん
2011/02/09(水) 02:30:11ちゅっちゅ
0967デフォルトの名無しさん
2011/02/09(水) 07:43:46すみません勘違いでした
ちなみ>>963でかってに変換されてるんですけど>は&gt;、<は&lt;になっていて問題無いみたいです
実際は唐竍鰍ンたいな機種依存文字が入ってるいるとエラーになっています
0968デフォルトの名無しさん
2011/02/09(水) 09:09:14>>1
> ■質問する人へ
0969デフォルトの名無しさん
2011/02/09(水) 09:40:46・ dup も clone も浅いコピーであることについてここに判子押した上で実際に dup して rescue する
・ コストが高いことを理解した上で Marshal.load(Marshal.dump(arg)) する
・ 引数を複製しないと安心できないというのは70パーセントくらいの割合でデザインミスなので考え直す
お好きなものを張り切ってどうぞ
0970デフォルトの名無しさん
2011/02/09(水) 10:18:41headline_url = "http://yp.ladio.livedoor.jp/stats/list.xml"
xml = open(headline_url).read
xml = xml.sub!(/encoding="shift-jis"/){'encoding="CP932"'}
aa = REXML::Document.new(xml).root
でどうだ
0971デフォルトの名無しさん
2011/02/09(水) 10:22:58headline_url = "http://yp.ladio.livedoor.jp/stats/list.xml"
xml = open(headline_url).read
xml.sub!(/encoding="shift-jis"/){'encoding="CP932"'}
aa = REXML::Document.new(xml).root
もし使ってる iconv が Windows-31J を解釈できる非公式 iconv なのなら
指定するのは CP932 ではなく Windows-31J のほうがいい
もし、CP932 を指定しても Iconv::IllegalSequence の例外が出てしまう場合は…
0972デフォルトの名無しさん
2011/02/09(水) 10:34:28encoding="shift-jis" って宣言したなら Shift_JIS 以外の文字は入れないで頂きたい
@ABとか鰍ニかとかご法度
本当は REXML::Document.new(xml, :encoding=>'CP932') とか指定できるのが望ましいんだけど
そういう構造にはなってないなさすが原産地外国
ちなみに Nokogiri だと Nokogiri::XML.parse(xml, nil, 'CP932') で動作する
0973デフォルトの名無しさん
2011/02/09(水) 16:08:22ありがとうございます解決しました
機種依存文字は意識したこと無かったので勉強になりました
>>968
すいません気をつけます
0974デフォルトの名無しさん
2011/02/09(水) 19:23:39反応ありがとうございます。
3番目の設計見直しでいきます。
1番目は今のやり方です。浅いコピーだということは承知しておりまして、比較的安全にと書いたのはそういう意味です。言葉足らずでしたね
2番目、今回例外処理のコスト高を何とかしたいというのが動機でしたので。
active_supportではduplicable?を定義してますね。姑息な手段に思えます。ruby本体でサポートして欲しいなあ
0975デフォルトの名無しさん
2011/02/09(水) 19:34:16昨日見たときは "\x13" だかの変な制御コードがあって引っかかってたけど、今日見たら無くなってた
0976デフォルトの名無しさん
2011/02/10(木) 00:12:01スレ内容が全く理解できないという。
0977デフォルトの名無しさん
2011/02/10(木) 00:27:44if hoge && hoge.isXXX?
こんな操作を毎回やっているのですが、rubyらしい手法はありますか?
設計が悪いとかnullObject使えとかそういう感じなんでしょうか
0978デフォルトの名無しさん
2011/02/10(木) 00:38:00だせえ!やーいやーい!
0979デフォルトの名無しさん
2011/02/10(木) 00:44:59お前童貞だろ
0980デフォルトの名無しさん
2011/02/10(木) 00:50:57if param.is_foo? といきなり書くと param が nil だった場合 NoMethodError になってしまう
かと言って if param && param.is_foo? と書くのは正しいのだが冗長に見えて仕方がない
なんとかする方法はありませんか?
というような質問はしょっちゅう出るのだが、汎用な回答はない
if param && param.is_foo? と書くようにするのがいちばん無難
あとは NoMethodError が出ることを駄目データが出たメッセージとして許容するとか
0981デフォルトの名無しさん
2011/02/10(木) 01:28:45nullを返す場合があるメソッドを読んだ時にだけチェックすればいいのだ。
0982977
2011/02/10(木) 02:36:28なるほど、まあ無難と言われてちょっと安心です。
methodや機能それぞれについてアサーション(一般的な意味を含む)
をしっかり考えてそれを前提にすれば、nullチェックなどいちいち書かなくてもいい
という意見にも納得です。
0983デフォルトの名無しさん
2011/02/10(木) 02:37:020984デフォルトの名無しさん
2011/02/10(木) 02:56:35無意味なnilチェックでバグを見逃すことになる。
0985デフォルトの名無しさん
2011/02/10(木) 04:03:48nil が起こす NoMethodError はかなり特別だ
たいていの Ruby プログラマは、これを「nil かどうかチェックして分岐しとけよ糞が」とは思わない
むしろいわゆるシグナルとして残す
ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
0986デフォルトの名無しさん
2011/02/10(木) 05:00:38> nil が起こす NoMethodError はかなり特別だ
はあ?
> ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
はあ?
自称上級者気取りが初心者を混乱させるのはやめてほしいな
0987デフォルトの名無しさん
2011/02/10(木) 06:29:01息が臭いだけ。
0988デフォルトの名無しさん
2011/02/10(木) 07:52:310989デフォルトの名無しさん
2011/02/10(木) 07:54:13たいていis無しのxxx?にする
0990977
2011/02/10(木) 08:39:20?そのものはboolを返すという記号としては有りだと思うけど。
0991デフォルトの名無しさん
2011/02/10(木) 11:48:13Java だと、ぬるぽだな。これが一番わかりやすいかな。
C だとSegmentation fault になる。
segmentatino fault だと色々原因がありそうだけど、殆どがぬるぽなんだよな。
0992デフォルトの名無しさん
2011/02/10(木) 12:01:30ものによっては rescue で自前の例外を発生させてユーザーにわかりやすく知らせたりもするぬ
0993デフォルトの名無しさん
2011/02/10(木) 12:20:1435分になっても立ってなかったら失敗なので次の人どうぞ
0994デフォルトの名無しさん
2011/02/10(木) 12:30:420995デフォルトの名無しさん
2011/02/10(木) 12:33:040996デフォルトの名無しさん
2011/02/10(木) 12:36:140997デフォルトの名無しさん
2011/02/10(木) 12:51:350998デフォルトの名無しさん
2011/02/10(木) 13:09:530999デフォルトの名無しさん
2011/02/10(木) 13:10:341000デフォルトの名無しさん
2011/02/10(木) 13:12:4010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。