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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
115 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:46:52 ] >>113 サンプルコード動いたけど。 $ ruby -v ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] $ gem -v 1.2.0 $ gem list | grep extractcontent extractcontent (0.0.1) >>114 メモリが許す限りだけど、どのくらいメモリがあるかは感知しないので、 物理メモリを超えて使おうとすればスラッシングして涙目に。
116 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:34:07 ] >>113 $ ruby --version ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] $ gem --version 1.3.1 でも動作した。 エラーからして、ExtractContentは定義されてるけどExtractorまでは定義されてないってことになるが 妙だな。1ファイルに収まるライブラリなのに。
117 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:57:18 ] カレントディレクトリにextractcontent.rbってテストで作っててその中でモジュール定義してるとか
118 名前:113 mailto:sage [2008/11/30(日) 19:58:20 ] >>115 >>116 自分も動きました。 一度間違ってrootでないアカウントでgemインストールしてしまい、 それを消して、再度rootで入れました。そのときに~/.gemができてそれ以下を読みに行こうとしてたっぽいです。 どこの設定に.gem以下を読みに行くかわからないのでユーザ作り直して、そこで実行するときちんと動作しました。
119 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 10:57:38 ] 書籍「Ruby レシピブック第二版268の技」のP.289のスクリプトを動かしたんですが、 結果がちょっとおかしいです。 class Numeric def round_n(nth) num = self*(10**(-nth)) return num.round()*(10**nth) end end num = 438.1728 p num.round_n(-3) #=> 438.173 結果は↓ Rational(438173, 1000) 何がいけないんでしょうか?よろしくお願いします。
120 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 11:14:40 ] >>119 何がどうおかしいと思うの?
121 名前:119 mailto:sage [2008/12/01(月) 11:26:11 ] >>120 本来"438.173"と表示されるはずが"Rational(438173, 1000)"と表示される辺りです。 Rational(438173, 1000)と表示されるのが正しいのでしょうか?
122 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 12:08:37 ] >>121 それは、実行前のどこか (irbで前に実行したスクリプトか、あるいはrequireで読み込んだ野良ライブラリのどこか)で require 'rational' をしている 何もしてない状態ではFloatが返る
123 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 12:26:28 ] raise "message" と raise XxxError.new("message") と raise XxxError の 違いがわかりません。どう使い分けるべきでしょうか。
124 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 12:28:03 ] >>121 なるほどそう読むのか。 Rational で返ってくるということはどこかで Rarional を require してるんだよな? そうすると、こんな具合↓に演算子が再定義されるとのこと。 doc.loveruby.net/refm/api/view/library/rational
125 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 13:39:45 ] >>123 見たままそのまんまです 例外というシステムはユーザーに情報を伝えることだけが主目的じゃないわけで ユーザーに情報を伝えるだけなら旧来の 「スクリプト○○行目の○○メソッドで引数○○がエラー起こしましたので終了します(・ε・)プップクプー」 と表示して即終了するだけでいいんだしさ 1行目は捕捉しても意味がないエラー(エラーが出たこと自体がまずいとき) 2行目は捕捉して回復処理を行えうる例外 3行目は捕捉可能でユーザーにも情報を与えたいとき 組み込みの例外のうちどんなものをどんなときに使うか、というのは特に定まってないので好きに悩め 引数が間違ってるからといって必ず組み込みの ArgumentError を使わなければならない (オリジナル例外もこれを継承しなければならない)というわけではない
126 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 13:49:58 ] 自分で例外クラス作るのは公開する気のあるモジュールだけだな 作ってる最中は全部 raise "message" になってる 中間的な一時的変数の名前考えるのめんどくさいという話に少し似ている
127 名前:119 mailto:sage [2008/12/01(月) 14:58:03 ] >>122 ,124 rubyを始めた頃にirbでやったみたいです。(単品で動かしてもRationalになるため) 戻し方が分からないので.to_fで対応しておきました。 ありがとうございました。
128 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 15:33:05 ] ここで出る例外をキャッチできればこっちでなんとかするのに、と思えるモジュールほどRuntimeErrorしか出さない 例外を使いこなすのははセンスが要るねえ
129 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 15:38:30 ] Matzが例外について熱く語ってる記事とかない? C#の中の人だとこういうのがあるんだけど ttp://www.artima.com/intv/handcuffs2.html
130 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 16:23:28 ] 最初の分厚い黄色い本に何か書いてあるかも 例外機構については適当に導入したんだと思う
131 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 16:54:01 ] アスキーから出てた奴だよね。チャンスがあれば読んでみる。ありがとう
132 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 19:08:35 ] >>123 raise "message" -> raise RuntimeError, "message" raise XxxError.new -> raise XxxError raise XxxError -> raise XxxError 2番目は例外オブジェクトを渡す形式。 なんかどっかに取っておいてある例外を raise @ex みたいに挙げるとか。 例外を挙げる前にアクセサを呼んで情報をセットするときとか。 一番使われてるのは3番目じゃね? raise XxxError, "message" -> raise XxxError.new("message") と同じ。 1番目の形式は3番目の形式の省略形と言えるけど、これに合わせて rescueでも例外クラスを省略するとRuntimeError以下を捕捉する。 捕捉するな、ヤバいことになったぞ、ってときはExceptionとかRuntimeErrorよりスーパークラスな もの挙げたほうがいいと思う。
133 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 21:50:27 ] >>125 >1行目は捕捉しても意味がないエラー(エラーが出たこと自体がまずいとき) うそつけ。 raise "message" は単にエラークラスを省略しただけであり、「捕捉しても意味がない」なんてことはない。 >2行目は捕捉して回復処理を行えうる例外 >3行目は捕捉可能でユーザーにも情報を与えたいとき 逆だろ。 ユーザに情報を与えるなら raise XxxError じゃなくて raise XxxError.new("message") のほう。 初心者スレでこんなウソを垂れ流さんでくれ。初心者が間違って覚えてしまうだろうが。 それともなんかの工作員か?
134 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 21:59:28 ] >>132 >rescueでも例外クラスを省略するとRuntimeError以下を捕捉する。 ウソつけ。 rescue =< ex で捕捉されるのはStandardErrorだ。 >捕捉するな、ヤバいことになったぞ、ってときはExceptionとかRuntimeErrorよりスーパークラスな >もの挙げたほうがいいと思う。 ひどい日本語だな。「ExceptionやRuntimeErrorより...」と読み間違えてしまうじゃないか。 「捕捉するな、ヤバいことになったぞ、ってときは、Exceptionのような StandardErrorよりスーパークラスなものをあげたほうがいいと思う。」 「捕捉するな、ヤバいことになったぞ、ってときは、StandardErrorより上位の例外クラスを使ったほうがいいと思う。」 自分の日本語力のなさを「2chだからどうこう」と言い訳すんなよ?
135 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 22:15:39 ] >>133-134 が一体何にそんなに怒ってるのかが理解できない
136 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 22:55:54 ] Ruby使ってる人間であれば、普通に怒るべきところだと思う
137 名前:132 mailto:sage [2008/12/02(火) 01:54:41 ] >ウソつけ。 >rescue =< ex >で捕捉されるのはStandardErrorだ。 フォローthx、ふつーに間違えた。 でもrescue => ex だと思う。肩の力抜けよ。 >ひどい日本語だな。「ExceptionやRuntimeErrorより...」と読み間違えてしまうじゃないか。 いいじゃん、Exceptionより上の例外クラスないし。
138 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 02:18:02 ] そもそも raise Exception とか書いたら rescue Exception => ex とか書く奴が絶対出てくると思うんだが
139 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 02:27:28 ] けどライブラリのバグとかを教えるのにException挙げるぐらいしか手がないんだもんよん。 Rubyスクリプトからfatal触れないし。 JavaでError(だっけ?)系統の例外を捕捉するのがいい顔されないみたいに、やったら叱るしか ないんじゃないのかなぁ… irbみたいなのを書けるように、そう書けること自体は多分必要だし。
140 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 06:04:02 ] >>135 その人にとってRubyは神聖なものでRubyしか取り柄がないのですよ だから普通の指摘ができない
141 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:16:08 ] 2chだからといって出鱈目過ぎる奴はどうかと思うがな
142 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:22:58 ] >>140 間違ったことをしたり顔で書いてる人にいわれてもなあ・・・
143 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:24:47 ] >>139 >けどライブラリのバグとかを教えるのにException挙げるぐらいしか手がないんだもんよん。 どういう意味?
144 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:39:19 ] 普通に指摘できないのは壊れてる証だとは思う MLでも時々見る 記名でできるのはある意味凄いが真似したいとも思わん
145 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 15:54:47 ] >>143 Cではassertマクロを使うような場所というか… case value when :hoge ... when :piyo ... when :foo ... else #絶対に来ないはずの分岐 raise Exception, 'must not happen' end みたいな。るびまで読んで使い出した。
146 名前:デフォルトの名無しさん [2008/12/02(火) 16:35:17 ] さいきんやっとREXML::Document関連の使い方をうっすら覚えた程度の初心者ですが、 get_elementsで要素ごとに引っ張り出すようにしたら その数が20個くらいに膨れ上がりました。 その処理が終わるまでものすごく遅くなる(終了まで10秒程度)ですが、 何か高速に行なう方法とかないですか? 通常要素ね具体的には特定のタグ名ごとに特定の変数に入れる処理を一番高速にやるにはどのようにするのが一番いいでしょうか。
147 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 16:45:40 ] gem の Hpricot などの C で書かれた高速なパーサを利用してるライブラリを使う REXML は「全部 Ruby で書かれてる! Ruby 最高!」という人が使うライブラリ 遅いなと思ったら(そしてプログラムのインストールが可能な環境なら)即っと乗り換えてよし
148 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 17:12:48 ] Speed Comparison libxml vs. rexml in seconds libxml rexml opening 0.003954 0.104750 attribute_add 0.001895 0.011114 subelems 0.000585 0.004729 xpath 0.013269 2.981499
149 名前:デフォルトの名無しさん [2008/12/02(火) 20:11:30 ] >>147 無料のレンサバってインストールできるでしょうか?
150 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:22:07 ] 最近のレンタルサーバってインストールするものなのか? >>149 そのレンタルサーバサービスでrubygemsのユーザーインストール実績があればたぶん可能 まあ、つまり、無料レンタルサーバではきっと無理だろうな 俺はRubyスクリプトを外部使用するためだけにさくらインターネットの年5千円プラン使ってる
151 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:29:02 ] REXMLは遅くなってしまう処理はどう足掻いてもとことん遅い Ruby以外の外部プログラムにぶん投げて結果を置換してevalしたほうが速いとかマジキチ
152 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:42:06 ] >>146 SAXライクなAPIがあったと思うので挑戦してみては REXML SAX でぐぐったらそれなりに引っかかるようだ
153 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:21:20 ] evalの中で「evalをする」を記述することはできる? eval(<<EOS) def hello(person) eval "Hello, #{person}!" end EOS これはエラーになるよね > NameError: undefined local variable or method `person' for main:Object
154 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:41:36 ] そこで2重にする意味が分からんけどこういうこと? eval(<<EOS) def hello(person) "Hello, \#{person}!" end EOS
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 ] 村の掟ワロタ