2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Ruby 初心者スレッド Part 40

1 :デフォルトの名無しさん:2010/12/11(土) 15:46:15
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

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

952 :デフォルトの名無しさん:2011/02/08(火) 15:52:38
loopを置き換えるならオリジナルloopを呼ぶか
自分でStopIteration例外を補足する必要があります

カウンター付きloopの提案
引数つけたときだけカウンター回せばいいんじゃないだろうか
これなら既存の使い方のパフォーマンスも落ちないはず
ついでにEnumeratorも生成できれば便利なのでは
引数は succできるやつとEnumeratorのみ受け付けれられればいいかな

でも、名前がだめだめなのでまったく採用の見込みは無さそう
loopにはカウンターをまわすイメージが無いので


953 :デフォルトの名無しさん:2011/02/08(火) 15:54:52
alias :orig_loop :loop
def 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)


954 :デフォルトの名無しさん:2011/02/08(火) 18:13:02
というより最近のrubyだと
loop.with_index{|_,i| p i }
とかできるんだなw初めて知った

955 :デフォルトの名無しさん:2011/02/08(火) 18:49:36
うおー、そんなのできるんだ、と嬉々としてコード書き直してみたら、
サーバ(CentOS5)のRubyが1.8.5だったときの絶望感ったらないね。

956 :デフォルトの名無しさん:2011/02/08(火) 18:50:35
>>954
どういう仕組みなの?それ

957 :デフォルトの名無しさん:2011/02/08(火) 19:13:42
>>954
おおー、ブロックなしだと、Enumeratorを返すようになったんだ。

958 :デフォルトの名無しさん: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が付いてくるし


959 :デフォルトの名無しさん:2011/02/08(火) 20:41:56
>>955
おいやめろ

960 :デフォルトの名無しさん:2011/02/08(火) 22:57:00
実用面での欠落そっちのけでオナニー記述ばっかり充実していくなRubyは

961 :デフォルトの名無しさん:2011/02/08(火) 23:13:39
言語オタク用言語ですから(キリッ

962 :デフォルトの名無しさん:2011/02/09(水) 01:05:19
dupできるかどうか判別する方法はないでしょうか?

初期値を比較的安全に設定するために、指定された初期値を dupして代入しようとしましたが、
初期値が数値などの場合 dup で例外が発生します。
respond_to? でdupできるかどうか判別できるかとも思いましたが、dup できなくても true が返ってきます。
今は仕方がないので例外を捕捉して例外時はそのまま代入していますが

963 :デフォルトの名無しさん:2011/02/09(水) 01:40:36
headline_url = "http://yp.ladio.livedoor.jp/stats/list.xml"
xml = open(headline_url)
aa = REXML::Document.new(xml).root

このコードでxmlに<とか>が入ってるとパースエラーになってしまうんですがどうすればいいでしょうか


964 :デフォルトの名無しさん:2011/02/09(水) 02:18:26
>>963
ねとらじの運営にゴルァするのがベストかと
well-formedなXMLを送ってこいと

965 :デフォルトの名無しさん:2011/02/09(水) 02:27:09
そのライブラリは使ったことないけど、もしそれが本当なら
xmlの必須要素である<>があるとエラーなんて、ライブラリとしてあってはならないバグだ
即刻バグ報告すべき

966 :デフォルトの名無しさん:2011/02/09(水) 02:30:11
>>965
ちゅっちゅ

967 :デフォルトの名無しさん:2011/02/09(水) 07:43:46
>>964-965
すみません勘違いでした
ちなみ>>963でかってに変換されてるんですけど>は&gt;、<は&lt;になっていて問題無いみたいです
実際は唐竍鰍ンたいな機種依存文字が入ってるいるとエラーになっています

968 :デフォルトの名無しさん:2011/02/09(水) 09:09:14
>>967
>>1
> ■質問する人へ

969 :デフォルトの名無しさん:2011/02/09(水) 09:40:46
>>962
・ dup も clone も浅いコピーであることについてここに判子押した上で実際に dup して rescue する
・ コストが高いことを理解した上で Marshal.load(Marshal.dump(arg)) する
・ 引数を複製しないと安心できないというのは70パーセントくらいの割合でデザインミスなので考え直す

お好きなものを張り切ってどうぞ

970 :デフォルトの名無しさん:2011/02/09(水) 10:18:41
REXMLは内部でiconvをバカ使いしてるので、日本で使われてるShift_JIS名義のXMLが苦手だったはず

headline_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

でどうだ


971 :デフォルトの名無しさん:2011/02/09(水) 10:22:58
ご飯食べてないので変な書き方になった

headline_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 の例外が出てしまう場合は…

972 :デフォルトの名無しさん:2011/02/09(水) 10:34:28
まあ元の XML のエンコーディング指定が間違ってるのがそもそもいけないんですけどね
encoding="shift-jis" って宣言したなら Shift_JIS 以外の文字は入れないで頂きたい
@ABとか鰍ニかとかご法度

本当は REXML::Document.new(xml, :encoding=>'CP932') とか指定できるのが望ましいんだけど
そういう構造にはなってないなさすが原産地外国

ちなみに Nokogiri だと Nokogiri::XML.parse(xml, nil, 'CP932') で動作する

973 :デフォルトの名無しさん:2011/02/09(水) 16:08:22
>>970
ありがとうございます解決しました
機種依存文字は意識したこと無かったので勉強になりました

>>968
すいません気をつけます

974 :デフォルトの名無しさん:2011/02/09(水) 19:23:39
>>969
反応ありがとうございます。
3番目の設計見直しでいきます。
1番目は今のやり方です。浅いコピーだということは承知しておりまして、比較的安全にと書いたのはそういう意味です。言葉足らずでしたね
2番目、今回例外処理のコスト高を何とかしたいというのが動機でしたので。
active_supportではduplicable?を定義してますね。姑息な手段に思えます。ruby本体でサポートして欲しいなあ

975 :デフォルトの名無しさん:2011/02/09(水) 19:34:16
>>963
昨日見たときは "\x13" だかの変な制御コードがあって引っかかってたけど、今日見たら無くなってた

976 :デフォルトの名無しさん:2011/02/10(木) 00:12:01
そろそろ初心者を卒業できたかなと思ってこのスレを開いてみたのに
スレ内容が全く理解できないという。

977 :デフォルトの名無しさん:2011/02/10(木) 00:27:44
nilチェックについて質問です。あるインスタンスの真偽値を取得する際に
if hoge && hoge.isXXX?
こんな操作を毎回やっているのですが、rubyらしい手法はありますか?
設計が悪いとかnullObject使えとかそういう感じなんでしょうか

978 :デフォルトの名無しさん:2011/02/10(木) 00:38:00
>>976
だせえ!やーいやーい!

979 :デフォルトの名無しさん:2011/02/10(木) 00:44:59
>>976
お前童貞だろ

980 :デフォルトの名無しさん:2011/02/10(木) 00:50:57
>>977
if param.is_foo? といきなり書くと param が nil だった場合 NoMethodError になってしまう
かと言って if param && param.is_foo? と書くのは正しいのだが冗長に見えて仕方がない
なんとかする方法はありませんか?

というような質問はしょっちゅう出るのだが、汎用な回答はない
if param && param.is_foo? と書くようにするのがいちばん無難
あとは NoMethodError が出ることを駄目データが出たメッセージとして許容するとか

981 :デフォルトの名無しさん:2011/02/10(木) 01:28:45
nullチェックとかめんどくさいだけだからしなくていい。
nullを返す場合があるメソッドを読んだ時にだけチェックすればいいのだ。

982 :977:2011/02/10(木) 02:36:28
>>980-981
なるほど、まあ無難と言われてちょっと安心です。
methodや機能それぞれについてアサーション(一般的な意味を含む)
をしっかり考えてそれを前提にすれば、nullチェックなどいちいち書かなくてもいい
という意見にも納得です。

983 :デフォルトの名無しさん:2011/02/10(木) 02:37:02
Rails厨なら Object#try

984 :デフォルトの名無しさん:2011/02/10(木) 02:56:35
むしろ「ここはnilを返さないはずだ」という認識を持っている場所ではnilチェックをしてはいけない。
無意味なnilチェックでバグを見逃すことになる。

985 :デフォルトの名無しさん:2011/02/10(木) 04:03:48
nullってなんですか(素)

nil が起こす NoMethodError はかなり特別だ
たいていの Ruby プログラマは、これを「nil かどうかチェックして分岐しとけよ糞が」とは思わない
むしろいわゆるシグナルとして残す

ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども

986 :デフォルトの名無しさん:2011/02/10(木) 05:00:38
>>985
> nil が起こす NoMethodError はかなり特別だ
はあ?

> ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
はあ?

自称上級者気取りが初心者を混乱させるのはやめてほしいな



987 :デフォルトの名無しさん:2011/02/10(木) 06:29:01
はあ?だけじゃ解からんだろ。
息が臭いだけ。

988 :デフォルトの名無しさん:2011/02/10(木) 07:52:31
どこが特別なのか全然伝わってこないよってことだろ

989 :デフォルトの名無しさん:2011/02/10(木) 07:54:13
ついでに書くと、Rubyでは一般にis_xxx?というメソッド名は付けない
たいていis無しのxxx?にする

990 :977:2011/02/10(木) 08:39:20
それだとif hoge is xxx thenというふうに読めなくて嫌だったりする。
?そのものはboolを返すという記号としては有りだと思うけど。

991 :デフォルトの名無しさん:2011/02/10(木) 11:48:13
>>985
Java だと、ぬるぽだな。これが一番わかりやすいかな。
C だとSegmentation fault になる。
segmentatino fault だと色々原因がありそうだけど、殆どがぬるぽなんだよな。

992 :デフォルトの名無しさん:2011/02/10(木) 12:01:30
誰かが nil を発生させてその結果処理が滞りました、ということを検出できる例外だからな
ものによっては rescue で自前の例外を発生させてユーザーにわかりやすく知らせたりもするぬ

993 :デフォルトの名無しさん:2011/02/10(木) 12:20:14
12時半に次スレ立てる
35分になっても立ってなかったら失敗なので次の人どうぞ

994 :デフォルトの名無しさん:2011/02/10(木) 12:30:42
うめ

995 :デフォルトの名無しさん:2011/02/10(木) 12:33:04
うめ

996 :デフォルトの名無しさん:2011/02/10(木) 12:36:14
立ってないのに埋めようとすんな

997 :デフォルトの名無しさん:2011/02/10(木) 12:51:35
ごめん

998 :デフォルトの名無しさん:2011/02/10(木) 13:09:53
立った?

999 :デフォルトの名無しさん:2011/02/10(木) 13:10:34
いいえ

1000 :デフォルトの名無しさん:2011/02/10(木) 13:12:40
新スレ立てムリポ

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

291 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.01.03 2014/02/20 Code Monkey ★
FOX ★ DSO(Dynamic Shared Object)