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

94 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 08:19:34 ]
あまりないな
Railsガン無視でRuby部分だけ使うことは可能だから、意識してRubyだけ使うぶんには問題なかろう

95 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 08:59:07 ]
>>93
ドライブ文字が決め打ちできるなら
USBメモリにruby本体を入れて、NYAOSなんかのコマンドラインシェルから
PATH環境変数を上書きするように設定すれば
RubyPortable的なこと(=インストールなしで動かすこと)ができる

俺はこの方法で実際にRubyPortableを作ろうとしたけど、ドライブ文字の検出方法が思いつかずに断念した

96 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 09:01:33 ]
意外とこれで間に合ったりして
ttp://tryruby.hobix.com/

97 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 09:43:33 ]
>>95
ディレクトリ構成は既知なんだからNYAOSを使わなくても、バッチで Ruby 自体を立ち上げて
system 'cd \\'
drive_name = `cd`
とかすればいいんでないの?

98 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 09:56:37 ]
>>97
%~d0 でバッチファイルがあるドライブ文字が取れるよ。
ちなみに %~p0 でバッチファイルがあるディレクトリ
%~dp0 でドライブ文字+ディレクトリ

99 名前:デフォルトの名無しさん [2008/11/29(土) 16:29:14 ]
ファイルセパレーターの変換って一般的にどうやってます?
path.gsub!(/\//, "\\")
とやると、/が\\になってしまうのですが。
\になるようにするにはどうすれば良いんでしょうか?


100 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:31:09 ]
>>97-98
ありがとう、おかげで念願のRubyPortableが完成した
(ファイルサイズを軽くするために、98のバッチファイル方式を採用させてもらいました)

101 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:32:10 ]
>>99
> puts "path/file".gsub("/", "\\")
path\file

102 名前:デフォルトの名無しさん [2008/11/29(土) 16:34:49 ]
>>101
obj = 'j:/test/obj'
obj.gsub!("/", "\\")
p obj

"j:\\test\\obj"

となってしまいます。\\でも良いのかなぁ?コンソールの仕様?



103 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:36:59 ]
>>102
ダブルクォーテーションもついてるぞ

104 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:37:10 ]
pだから。


105 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:37:19 ]
>"j:\\test\\obj"

"j:\test\obj"
なんてソースに書いたら問題あるのはわかるよね?
pの出力っていうのはそういう仕様、だから>>101ではputs使ってる。

106 名前:デフォルトの名無しさん [2008/11/29(土) 16:38:53 ]
なるほど。ありがとうございました。


107 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 19:18:03 ]
自分のメソッド名を取得する方法ってないですかね?
具体的には

def hoge
 p 自分のメソッド
end

hoge #=> "hoge"

というのが欲しいんですが

108 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 19:25:10 ]
caller(0)をチェックしてみるとか

109 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 19:30:46 ]
ttp://d.hatena.ne.jp/secondlife/20051013/1129210792
class Object
def current_method
begin
raise StandardError
rescue StandardError => e
e.backtrace[1].scan(/`(.*)'/).to_s
end
end
end

ぐぐってみたらこんなので可能ではあるけど
標準ではできないかなぁ

110 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 20:26:14 ]
自分自身の名前を知ることなく再帰呼び出しをしたいとかいう話なら
Yコンビネータでぐぐるとよろし。


111 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:45:32 ]
RUBY_VERSION >= '1.8.7' だと
__method__というのが。

112 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:39:57 ]
__METHOD__はRubuniusだっけ?



113 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 07:17:47 ]
extractcontentを使っている人いませんか?
ブログから本文のみを抜き取りたいのですが・・・・。
gemで入れたんですけど、作者のブログにあるサンプルが実行できません。
ttp://labs.cybozu.co.jp/blog/nakatani/2008/03/_rubyforge.html

エラーは
extract.rb:7: uninitialized constant ExtractContent::Extractor (NameError)
なんですけども。

114 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 11:42:01 ]
Hashについて教えていただきたいのですが
rubyのHashはどのぐらいの容量を保持できるのでしょうか?
メモリが許す限りの容量を代入していけるのでしょうか?

環境:MacOSX10.4
ruby 1.8.7

よろしくお願いいたします。

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
>ほらわかりやすい。

どこがだよ。







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

前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