Ruby 初心者スレッド ..
[2ch|▼Menu]
116:デフォルトの名無しさん
08/04/18 02:09:29
>>113
どうでもいいが、ページの上にある「Abount」に吹いた。

117:デフォルトの名無しさん
08/04/18 02:43:58
プログラミングRubyに
ブロックの記述は、一行の場合は{}
二行以上の場合はdo〜endを使うのが
Rubyコミュニティーのコンセンサスだと書いてありましたが
ブロックは複数行になる場合も{}の方が視認性よくないですか?
すべてendだと、何を閉じるものなのか、頭を見ないと分かりませんが、
{}だと、閉じカッコを見るだけで
何を閉じているのかがだいたい推測つきますし。
endにする合理的理由ってあるのでしょうか?

118:デフォルトの名無しさん
08/04/18 02:56:59
主観的な問題

119:デフォルトの名無しさん
08/04/18 03:06:49
・whileやifとの統一性
・だいたいソースは上から読む>何を閉じるものなのか、頭を見ないと分かりません
・Hashリテラルだって}で閉じるし、%{...}文字列リテラルなんかもある

でも結局は>>118か。

120:デフォルトの名無しさん
08/04/18 04:50:55
end地獄が大嫌いだからdo〜endなんか絶対に使わない

121:デフォルトの名無しさん
08/04/18 06:09:35
ってか、
そもそもなんでendなの?
文と紛らわしいしタイプも面倒くさい。
Rubyの最大の欠点がend。

122:デフォルトの名無しさん
08/04/18 06:48:00
}地獄が大嫌いだから(複数行で){}なんか絶対に使わない

>>121
主観的な問題

123:デフォルトの名無しさん
08/04/18 06:56:24
主観で片付けるのはおかしいよ
文と紛らわしいのも、タイプ数が多いのも
定量的な問題じゃん
理性的な判断を下せる範疇にあるはずだよ

124:デフォルトの名無しさん
08/04/18 07:49:21
     end
    end
   end
  end
 end
end

125:デフォルトの名無しさん
08/04/18 07:52:02
主観的な問題でないのなら
なぜ「do〜end超読みやすい! すっきりする」って人と
「do〜end読みにくい上に紛らわしすぎ」って人とに分かれるんだ

126:デフォルトの名無しさん
08/04/18 08:04:48
だって引数の記述と通常の文との違いを明確にしたいmatzだよ
その認識の延長線上には、文と紛らわしいendの否定があるはずなんだよ
endをすぐに完全に廃止しろとは言わない
試しに{}も許容するようにしたらいいんだよ
コストはそんなに高くないだろう
その小さな変化は
きっと世界中の開発者に歓迎されると思うよ。

127:デフォルトの名無しさん
08/04/18 08:07:12
・yaccの能力で、beginとcaseの文法が上手く纏められなかった
・endを使うとruby-mode.elが書けそうだった
こんな理由じゃなかったっけ。

ifやwhileのこと?
>試しに{}も許容するようにしたらいいんだよ

128:デフォルトの名無しさん
08/04/18 09:04:24
endでいいと思うけど、emacsとかで
対応するclass,def,if,forにジャンプする
機能って無いですよね?

129:デフォルトの名無しさん
08/04/18 09:16:27
>>128
あるなら俺も使いたい。
{} の方ならこれでジャンプできるけどな。

URLリンク(www.bookshelf.jp)
;; By an unknown contributor
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

(global-set-key "%" 'go-to-paren)

130:デフォルトの名無しさん
08/04/18 09:43:04
M-x ruby-beginning-of-block

131:デフォルトの名無しさん
08/04/18 09:44:51
あ、>>130は「このブロックの最初」にカーソルを移動な
カーソル移動がめどいという場合には妥当な機能

132:デフォルトの名無しさん
08/04/18 09:55:22
ああ、キー操作あった
C-M-p
ちなみに {} のブロックでも有効
ただ、厳密には「インデントつける」計算上のブロックの最初に移動する
だから、

File.open('hoge.txt'){|f|
f.puts data
}

の場合は { ではなく File の F に移動する

File.open('hoge.txt'){|f| f.puts data }

の場合は検知できなくて、「ひとつ上」のブロックの最初に移動する

133:デフォルトの名無しさん
08/04/18 11:06:13
end は予約語だから、Rubyスクリプトを読んでるという頭の中では何かと間違えることはないなあ
(むしろ bashスクリプトで doneではなく endと書いて動作不良に首を傾げる)
慣れと主観っちゃそのとおりだがそれはそれで台無しな意見だ(w
素直に着色なエディタを使うというのはどうだろう

134:デフォルトの名無しさん
08/04/18 17:11:08
モジュールの中で、
自分を読み込むクラスに実装を期待するメソッドを定義あるいは明示するには
どうしたらいいですか?

135:デフォルトの名無しさん
08/04/18 17:19:34
まにゅあるに「hogeとhageはつくってね」とかく

136:デフォルトの名無しさん
08/04/18 17:28:37
え・・
Javaでいうabstractみたいな方法はないのでしょうか

137:デフォルトの名無しさん
08/04/18 17:46:52
def hoge
 raise "override me!"
end

138:デフォルトの名無しさん
08/04/18 17:46:54
実行中にメソッドを追加したり削除したりできるRubyではそもそも無理
別途ユニットテストとかでソースコード自体を検査させるべき

139:デフォルトの名無しさん
08/04/18 17:47:05
こういうのとか?
URLリンク(blade.nagaokaut.ac.jp)

140:デフォルトの名無しさん
08/04/18 18:39:10
The Ruby Way 第2版
URLリンク(www.amazon.co.jp)
おおむね今週に発売(たぶんたいていの本屋に並んでるはず)
ボリュームアップし過ぎて5千円札では足りなくなりました

141:デフォルトの名無しさん
08/04/18 19:09:25
結局実行時だけど、自分はこうしてる
 def foo
  bar
 end

private
 def bar
  raise NotImplementedError
 end

142:デフォルトの名無しさん
08/04/18 19:14:58
モルボル教だかのお布施額がアップしたんだろ

143:デフォルトの名無しさん
08/04/18 19:20:36
def SomeModule.included(klass)
 raise unless klass.method_defined?(:foo)
end
とかやればいいんじゃね?

144:デフォルトの名無しさん
08/04/18 19:20:54
19種類のRubyテンプレートエンジンレビュー
Mini reviews of 19 Ruby template engines
URLリンク(www.hokstad.com)

19種類ってありすぎww

145:デフォルトの名無しさん
08/04/18 19:23:31
実行時にエラーが出るというのは致命的
実際にそのメソッドが使われないと、未定義かどうかのエラーが出ないんだからね

それこそ、めったに起きないエラー処理のメソッドだった場合は、
まともに動作して安心してた頃になって致命的なことになる

ソフトウェアテストでチェックすることをお勧めするよ

146:105
08/04/18 19:26:28
>>108
ありです

147:デフォルトの名無しさん
08/04/18 19:28:13
>>140
翻訳が変わってるのがすごく気になるな・・

148:デフォルトの名無しさん
08/04/18 19:39:37
rubyはスペルミスがあってもそのまま動きますから、小さいことは気にしませんw

149:デフォルトの名無しさん
08/04/18 19:48:44
>>147
同じく
クイープの翻訳は最近アテにならないからなあ

150:デフォルトの名無しさん
08/04/19 00:00:08
Ruby初心者ですアドバイスよろしくお願いします。
.txtファイルに書かれた半角スペースで区切られた単語郡を
それぞれ配列に格納するスマートな方法があればお教えいただけないでしょうか。
汎用性を持たすために、ファイルの読み込みは
ruby test.rb < gomi.txt
にしたいです。
windowsXP ruby1.8.6

151:デフォルトの名無しさん
08/04/19 00:07:20
つsplit

152:デフォルトの名無しさん
08/04/19 00:10:48
a bb ccc
dddd eeeee ffffff ggggggg

というようなテキストだと仮定
「それぞれ」という言葉から、1行目の配列と2行目の配列は別だと推測
ruby test.rb < hoge.txt
でも
ruby test.rb hoge.txt
でも動作する

# 配列を格納する配列
all_arr = Array.new
# readlines は 引数のファイル、無ければ標準入力から読み込んで各行を配列にして返す
readlines.each do |line|
# chomp で line を区切って配列にする
# 区切る"文字"は 正規表現の / / にマッチするものつまり半角スペース1個
arr = line.chomp.split(/ /)
# push メソッドで arr を all_arr の要素の末尾に追加する
# all_arr を「長くする」のではないことに注意
all_arr.push(arr)
end
# all_arr の中身を表示
p all_arr

153:150
08/04/19 01:40:27
150です。早々の回答を有難うございました>151,152
二次元配列のような形にしたかったので、152さんのおっしゃるとおりです。
配列の値をActiveRecordでsqlに挿入しようと思っていました。
本当に助かりました、有難うございました。

154:デフォルトの名無しさん
08/04/19 05:12:28
スキルレベルの微妙なちぐはぐさ加減が怖い

155:デフォルトの名無しさん
08/04/19 06:21:48
emacsをruby-modeで使っています
この環境で定義済みクラスやメソッドのリストを見たり、
定義済みのメソッドを自動補完させたりすることは出来ますか?

156:デフォルトの名無しさん
08/04/19 18:18:04
mixinとコンポジットの使いわけがよく分かりません
mixinがないほとんどの言語では、mixin的なことはコンポジットで実現しますよね
どういう時にmixinを使うんですか?

157:デフォルトの名無しさん
08/04/19 18:22:53
mixin は mixin 先の実装に依存した実装を追加したい時に使う。

158:デフォルトの名無しさん
08/04/19 19:44:38
ファイルパスから親ディレクトリを取得するにはどうしたらいいですか?

159:デフォルトの名無しさん
08/04/19 19:47:52
>>158
File.dirname(file_name)


160:158
08/04/19 20:01:35
DirとかFileUtilsばかり見てました
ありがとうございます


161:デフォルトの名無しさん
08/04/19 20:05:51
ライブラリのクラスメソッドを使う場合に
それを後に書く方法があれば教えてください
たとえば
File.dirname 'hogehoge'

'hogehoge'.(File.dirname)
みたいな形で書きたいんです

162:デフォルトの名無しさん
08/04/19 20:10:40
>>161
そうですか

163:デフォルトの名無しさん
08/04/19 20:15:50
どっかでそんな後置の言語を見た気がする
仮にRubyで実現するとしても、それを繋ぐのは . ではないだろうな

164:デフォルトの名無しさん
08/04/19 20:22:51
気持ち悪いと思わないなら
class String
def dirname
File.dirname(self)
end
end

あとはpathnameというライブラリもある。


165:デフォルトの名無しさん
08/04/19 20:38:34
というか何のためにそうしたいのかによるな

166:デフォルトの名無しさん
08/04/19 21:08:19
class Object
 def callback(method, mypos=0, *args)
  args.insert mypos, self
  method.call *args
 end
end

p Math.sqrt(400)
#=> 20.0
p 400.callback Math.method(:sqrt)
#=> 20.0

p [1,2,3,4,5,6][2,3]
#=> [3, 4, 5]
p 3.callback([1,2,3,4,5,6].method(:[]), 1, 2)
#=> [3, 4, 5]

こんなもんでどうかな

167:166
08/04/19 21:09:58
上のは >>161


168:デフォルトの名無しさん
08/04/19 21:46:47
>>165
クラスとオブジェクトとメソッドの理解がまだ足りないんだと思う
気持ちはわかるが考え方が不当

欲しいのはいわば pathenize_dirname メソッドと推測

p '/usr/local/bin/ruby'.pathenize_dirname
"/usr/local/bin/"

メソッドの引数形式を「カッコ悪い」と感じる時期に罹るハシカみたいな病気だ

169:デフォルトの名無しさん
08/04/19 22:30:45
え、>>161は見た目が気に入らないというだけ?
機能的な話かと思ったら、どうやら明後日を向いていたようだ。
そういうことであれば >>166>>161の美意識には適うまい。

170:デフォルトの名無しさん
08/04/19 22:33:10
こんなのもありか。

class String
def to_path
Pathname(self)
end
end

p '/usr/local/bin/ruby'.to_path.dirname


171:デフォルトの名無しさん
08/04/19 22:33:40
いや、pではto_strは呼ばれないな。putsで。


172:デフォルトの名無しさん
08/04/20 15:48:07
ERBについて教えてください。
railsのテンプレートでERBが使われてますが、
これは何かのタイミングで一度rubyのクラスに変換されてからHTMLに再び変換されるのでしょうか?
例えばJavaのJSPがJSP→サーブレット→HTMLと変換されるのと同じ流れですか?

173:デフォルトの名無しさん
08/04/20 16:05:58
>>172
<%%>の中身がそのままRubyコードとして抜き出され、
それ以外は_erbout.print ... という形に変換されてから
Rubyで評価される感じです。


174:172
08/04/20 16:30:00
>>173
なるほど、jspみたいにrhtmlファイルがクラスに対応するわけではないんですね。
あまり綺麗な仕組みではないですね…。
ありがとうございました。

175:デフォルトの名無しさん
08/04/20 16:31:52
単純に、ERBの簡単な使い方勉強するとイメージしやすいと思うよ
eRubyの仕様じゃなくて、ライブラリの使い方ね

176:デフォルトの名無しさん
08/04/20 17:47:33
mixiの「メッセージ」を送信したくて、URLリンク(d.hatena.ne.jp)を参考にして、以下のように書いてみました。
基本的にeditの部分だけを変更し

def edit title, content
@id = "12345"#相手のid
@edit_page = @agent.get('URLリンク(mixi.jp)'+@id)
edit_form = @edit_page.forms.name("messageForm").first
edit_form['subject'] = title.toeuc
edit_form['body'] = content.toeuc
confirm_page = @agent.submit(edit_form)
conf_form = confirm_page.forms[0]
p @agent.submit(conf_form)
end


以下を実行しました。

def mixi_message
mdw = MixiMessage.new("hoge@hoge.com","hogehoge")
mdw.login
mdw.edit "テストタイトル", "テスト本文"
end

177:デフォルトの名無しさん
08/04/20 17:48:07
結果、次のような出力になり、メッセージは送信されていませんでした。

#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::HTTP:0x2583fc0 URL:URLリンク(mixi.jp) @filename="s
end_message.pl", @body="">


送信できていない原因は何でしょうか?

178:デフォルトの名無しさん
08/04/20 17:49:28
結果、次のような出力になり、メッセージは送信されていませんでした。

#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::HTTP:0x2583fc0 URL:URLリンク(mixi.jp) @filename="s
end_message.pl", @body="">


送信できていない原因は何でしょうか?

179:デフォルトの名無しさん
08/04/20 18:16:00
>>176
WWW::Mechanizeは実際にサーバから送られてきたHTMLから指定された要素を抽出して実行している

素直に読むと

URLリンク(mixi.jp)ユーザーIDというページの結果を取得し、
<form name="messageForm"> というフォームで1番最初にあるフォーム中にある、
<input name="subject"> という、type が text か何かの入力欄に引数titleの内容を日本語EUCで入力
<input name="body"> という、type が text か何かの入力欄に引数contentの内容を日本語EUCで入力
<form name="messageForm"> のsubmit ボタンを「押して」結果のページを取得する
取得した結果の中の最初の <form> の submit ボタンを「押して」結果のページを取得する

という処理なんだけど、mixiのページ構成はきちんとそのようになってるかい?

180:デフォルトの名無しさん
08/04/20 18:55:48
176です。お返事ありがとうございます。
p conf_form
としてみたところ、出力に

#<WWW::Mechanize::Form::Field:0x4ba0de8 @name="submit", @value="confirm">

があり、これは、
「確認画面」の <input type="hidden" name="submit" value="confirm"> と一致しているので、
おそらく「確認画面」までは到達していると思います。

「確認画面」では formはひとつしかなく、

<form action="send_message.pl?id=1056392" method=post>
<input type="hidden" name="submit" value="confirm">
<!--略-->
<input name=yes type=submit value=" 送 信 ">
<!--略-->
<input name=no type=submit value=" 修 正 ">
</form>

という構成になっており、submitが二つあるのが怪しいかなと思っているのですが、
指定のない場合は、先にある「送信」が押されると思うので、条件は満たしているような気がします。
ほかに問題となりそうな点は何でしょうか?

181:デフォルトの名無しさん
08/04/20 20:37:02
num++
みたいな書き方が他言語とは挙動が異なるみたいなんですが
これはどういう動作をしているのでしょうか?

182:デフォルトの名無しさん
08/04/20 20:47:58
そもそも ++ はないよ

183:デフォルトの名無しさん
08/04/20 20:48:11
rubyにそんな演算子は存在しない

184:デフォルトの名無しさん
08/04/20 23:54:38
>>182-183
ありがとうございました
なんでないんでしょうね?
実装も単純そうなのになぁ

185:デフォルトの名無しさん
08/04/21 00:08:05




説明するの面倒なのでぐぐってくれ
インクリメントの実装自体は簡単なんだが、Rubyのほうそくが みだれる ので採用されない

186:デフォルトの名無しさん
08/04/21 00:12:19
かっちょええ説明法があればたぶん普通に採用されると思う
さあ頑張って
「自分を破壊し別のオブジェクトを生み出して置き換える」
メソッドの意味を説明して説得するんだ

187:デフォルトの名無しさん
08/04/21 00:18:12
モルモン教義的に不死がタブーでないのなら
Rubyでベニクラゲをモデリングしたいと言ってみる

188:デフォルトの名無しさん
08/04/21 00:23:36
ループが正常に実行した時にのみ、ある処理を実行する
というプログラムを美しく書く方法があれば教えてください。
フラグを用意し、ループを抜けてからフラグをチェックするのが
普通だと思いますが、フラグの存在が冗長な気がします
例外を使うのも、何かやりすぎのような気がします

189:デフォルトの名無しさん
08/04/21 00:56:43
do_this if array.all? {|x| ... }
とかじゃなく?


190:デフォルトの名無しさん
08/04/21 03:20:44
どこでもrescueされなかった例外を補足するには
どうしたらいいですか?

191:デフォルトの名無しさん
08/04/21 03:27:37
rescue すればいい

192:デフォルトの名無しさん
08/04/21 03:56:54
全体を囲む大きなbeginブロックを書くということですか?
視認性が悪くなるので、
前もってエラーハンドラみたいなものが登録できたらいいと思うのですが・・

193:デフォルトの名無しさん
08/04/21 04:07:33
基本的には処理はトップレベルにベタ書きすべきじゃないと思うから
(変数はなるべくローカルスコープに入れた方がいいので)、
C などの main 関数みたいに全ての処理を囲んだ関数を作って
トップレベルに記述する処理はその関数のみにしておくと良い。
そういう状態であれば、begin で囲むのもそこだけで済む。

194:デフォルトの名無しさん
08/04/21 04:18:35
ふーむなるほど…
ありがとうございました

195:デフォルトの名無しさん
08/04/21 06:16:46
Timeオブジェクトを引き算するとfloatが返ってきます
時間の差をあらわすオブジェクト(間隔オブジェクト?)が
返ってきて欲しいのですがどうしたらいいですか?

196:デフォルトの名無しさん
08/04/21 07:44:30
>>196
返って来たFloatがその間隔オブジェクト(秒.マイクロ秒)
欲しい単位が分なら (t2 - t1).to_i / 60 すればいい

197:デフォルトの名無しさん
08/04/21 10:59:01
>>186
代入演算子の一種として実装すればよい
例:a += 1

198:デフォルトの名無しさん
08/04/21 21:39:36
このへんを蒸し返してみたら?

URLリンク(blade.nagaokaut.ac.jp)


199:デフォルトの名無しさん
08/04/21 22:23:48
num++に問題があるというより
++numとnum++の挙動の違いをRubyの中に組み込むのに難があるという感じ?

200:デフォルトの名無しさん
08/04/21 22:32:18
succはあるんだから、前置++は構文だけの問題だね
後置は……


201:デフォルトの名無しさん
08/04/21 22:42:48
> succはあるんだから
ほほう
君のRubyでは
3.succ
として 3が 4になるのか?

202:デフォルトの名無しさん
08/04/21 22:43:01
馬鹿ばっかだな
演算子で終わることに自体に問題があるんだろ

203:デフォルトの名無しさん
08/04/21 22:45:52
>>201
ああ、succはsucc!じゃないよね
吊ってきます


204:デフォルトの名無しさん
08/04/21 22:59:58
で、誰が演算子で終わることを問題にしてるの?

205:デフォルトの名無しさん
08/04/21 23:51:33
Cだと 1++ で 1 が 2 になるのか。
おもしろいな

206:デフォルトの名無しさん
08/04/22 00:02:31
演算子で終わることの意味も分からない馬鹿がいるな

207:デフォルトの名無しさん
08/04/22 00:16:53
演算子で終わる云々なんて、この何回もループした議論の中で出てきたっけ?
そりゃ内部仕様は変えなきゃいかんだろうが、「演算子で終わったら駄目」な理由は?
というか採用されても、「特殊なメソッド」以上のものにはならんと思うが

208:デフォルトの名無しさん
08/04/22 00:17:20
RubyでCGI作ってみてるのですが、system(id root)とかのコマンド結果が
どうもHTTPヘッダーとして出力されてしまっているようです。

どうにか出力しない方法ってあるんでしょうか。

209:デフォルトの名無しさん
08/04/22 00:18:59
パイプ使って、標準出力/エラー出力を捨てとけ。

210:デフォルトの名無しさん
08/04/22 00:23:10
>>209
ありがとです。

211:デフォルトの名無しさん
08/04/22 01:48:37
DBIを使ってPostgresSQLと接続しようとしたのですが、上手くいきません。
環境は、
OS CentOS 5.1 64bit
Postgres 8.3.1
ruby-1.8.6-p114
ruby-postgres-0.7.1
dbi-0.2.0
です

接続しようとすると`load_driver'エラーが出ます。ruby-postgresだけだと接続出来るのですが、dbiだと駄目です。
ちなみにdbiのインストールオプションはruby setup.rb config --with=dbi,dbd_pgでインストールしました。

$ irb
irb(main):001:0> require "postgres"
=> true
irb(main):002:0> PGconn.connect("localhost", 5432, "", "", "testdb","user","wassword")
=> #<PGconn:0x2aaaaabaceb0>
irb(main):003:0> require "dbi"
=> true
irb(main):004:0> DBI.connect("dbi:postgres:testdb:localhost", "user", "wassword")
DBI::InterfaceError: Unable to load driver 'postgres'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:352:in `load_driver'
from /usr/local/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:282:in `load_driver'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect'
from (irb):4
from (eval):3

よろしくお願いします。

212:デフォルトの名無しさん
08/04/22 02:42:51
広くメソッドというもの自体をオーバーライドすることは出来ますか?
メソッドすべてにフックを仕込んで、メッセージのやりとりを
ロギングしたり、そういうことがしたいんですが

213:デフォルトの名無しさん
08/04/22 02:51:19
URLリンク(doc.loveruby.net)

214:212
08/04/22 03:04:54
>>213
こんな機能があったんですね
ありがとうございました

215:デフォルトの名無しさん
08/04/22 03:21:12
RubyWay読んでたら、Stringのeachは1.9ではなくなり、
each_lineを使うようになったと書いてありました。
今書いてるスクリプトには、ファイルからの読み込み処理等で
eachが結構あります。
これは書き換えないと1.9以降では動かなくなるのでしょうか?

216:デフォルトの名無しさん
08/04/22 06:46:11
ハッシュの存在しないキーを参照してもnilが返ってくるだけでノーエラーですが
多次元配列で存在しないキーを参照すると
undefined method `[]' for nil
になります
存在しなかったとしてもエラーが出ないように参照する方法を
教えて下さい

217:デフォルトの名無しさん
08/04/22 07:11:08
def nil.[](i)
nil
end

218:デフォルトの名無しさん
08/04/22 07:42:47
ハッシュのデフォルト値を[]にするとか

219:デフォルトの名無しさん
08/04/22 08:03:40
あ、スマンぼけてた。問題は配列のほうか。

220:デフォルトの名無しさん
08/04/22 08:16:16
多重ハッシュでも存在しないキー指定したら
undefined method `[]' for nil
になるじゃん

何をしたいか明確に書けよヴォケ

221:デフォルトの名無しさん
08/04/22 10:20:15
>>216
配列じゃなくてハッシュを使う

222:デフォルトの名無しさん
08/04/22 11:25:06
多次元配列などというものはRubyには存在しません

223:デフォルトの名無しさん
08/04/22 13:57:40
class TajigenHairetsu << Hash
def [](*arg)
super(arg)
end
def []=(*arg)
super(arg[1,-1], arg.last)
end

224:デフォルトの名無しさん
08/04/22 17:41:56
rubyのコマンドからファイルの有無を確認する方法は無いでしょうか?
無ければ指定したテキストファイルを作り
あれば追記するような仕組みを持ちたいので

225:216
08/04/22 17:50:19
217さんの方法でしのぐことにしました
ありがとうございました
>>220
ハッシュか配列かではなく
nilに[]が使えないことをどうしようかという話でした

226:デフォルトの名無しさん
08/04/22 18:17:46
>>224
ファイルのことについてどうこうしたいんだからFileクラスのメソッド探してみれ

227:デフォルトの名無しさん
08/04/22 19:31:56
だからfetch(i,default)を使えと

228:デフォルトの名無しさん
08/04/22 20:24:49
問答無用に'a'でopenすればええんとちゃうの?

229:デフォルトの名無しさん
08/04/22 21:04:12
>>228
のぞんでいたどうさができました
おそらく不具合の原因は参考にしていたサイトがafile=File.new(*****)
とnewを使っていたためのようです
今まで5個ほど言語を学んできましたがrubyほどシンプルで強力な言語は
無いと感じました
本当にありがとうございます!

230:デフォルトの名無しさん
08/04/22 21:28:45
>>215

動かなくなるよ。
str.each は、str.scan(/^/).each に置き換えよう。


231:デフォルトの名無しさん
08/04/22 21:42:21
IO#eachは残ってるんじゃなかったっけ?

232:デフォルトの名無しさん
08/04/22 22:15:01
class String
 unless method_defined?(:lines)
  def lines
   self
  end
 end
end

としておいて、1.8系でもstr.lines.eachと書いておくという手も…

233:デフォルトの名無しさん
08/04/22 23:06:52
irb > print "test"
この結果が
ttt => nil
と出るんですが、これはどういう意味なんですか?

irb => ttt
と出力されることを期待したのですが。

234:デフォルトの名無しさん
08/04/22 23:09:48
tttはtestのつもり?
irbの=>の後ろに出るのは、入力した式(print "test")を評価した値。
x= print "test"
とすると x = nil になるのといっしょ。

testという文字列が書き出されるのは式の評価(値を求めること)の、まぁ副作用だ。


235:233
08/04/22 23:38:04
>>234
おぉ丁寧にありがとうございます。
入力コマンドを単純に実行するのではなく評価するだけなんですね。
てか使い道あるんでしょうかね…?

236:デフォルトの名無しさん
08/04/23 00:34:45
ないよ

237:デフォルトの名無しさん
08/04/23 00:37:12
irb > print "test"
この結果が
ttt => nil
^^^~~~~~~
^:printの出力
~:irbが返り値のインスペクションを出力

コマンドって…

238:デフォルトの名無しさん
08/04/23 00:43:07
ttt => String
にはならんの?

239:デフォルトの名無しさん
08/04/23 00:51:04
たぶん出力の意味を勘違いしてるよ。
irbは「=> 返り値」を印字してるだけ。
その前のprintの出力に改行がないからそんな見た目なだけ。
もしそんな出力がされるってことは、printがStringクラスを返してるというイミフなことになるぞ。

240:デフォルトの名無しさん
08/04/23 06:24:22
RubyのIDEでおすすめは何ですか?
今はNetBeansを使っていますが、他のファイルのクラス等が
自動補完できないのでもう少し高機能なのが欲しいと思っています

241:デフォルトの名無しさん
08/04/23 09:33:10
おすすめは無い
あと1年くらいしたら便利なの出てくるぜと3年くらい前から言われてる

242:デフォルトの名無しさん
08/04/23 11:46:14
rubyらしいな

243:デフォルトの名無しさん
08/04/23 14:09:47
pythonから移ってきた人向けの入門ページとかないですか?

244:デフォルトの名無しさん
08/04/23 15:31:57
for文について質問です。

for book in book_array
end

このように配列を回すfor文の中でインデックスを取得することは出来ないのでしょうか?


245:デフォルトの名無しさん
08/04/23 15:33:59
Enumerable#each_with_index

246:デフォルトの名無しさん
08/04/23 15:53:58
>>245

ありがとうございます!できました。
java出身だとfor文でインデックス取れないって変な感じですね。


247:デフォルトの名無しさん
08/04/23 16:15:35
数値計算関係はpython
日本語処理はruby
という使い分けしようと思っててるんですが、うまくミックスする方法はないのでしょうか?

248:デフォルトの名無しさん
08/04/23 16:39:13
質問が曖昧すぎて意味不明


249:デフォルトの名無しさん
08/04/23 19:40:43
>>246
for i in (0..book_array.size)
p i, book_array[i]
end

カウンタ変数もなしにインデックスが取れるわけないだろう

250:デフォルトの名無しさん
08/04/23 20:37:16
>>249
× ..
○ ...

251:デフォルトの名無しさん
08/04/23 21:54:00
上と下ならどっちがrubyらしいですか?

if foo == ""
end

if foo.is_a? String && foo.empty?
end

252:デフォルトの名無しさん
08/04/23 22:07:13
オブジェクトの型をチェックするコードは常用するものではない。


253:デフォルトの名無しさん
08/04/23 23:04:56
>>247
全部Python

254:デフォルトの名無しさん
08/04/23 23:13:04
てかRubyの日本語処理ってNKFべっただし
PythonからRuby向けを切り出す必要があるとは思えない
Pythonで書けるなら全部Pythonで書くのがベスト

255:デフォルトの名無しさん
08/04/24 00:18:41
rubyで簡単なツールを作ろうと考えております
GUIを組むにはruby/tkとか色々種類があるようなのですが、
最もメジャーなのはどれでしょうか?

ツールの詳細としては、チェックボックスやリストで設定項目を設定し、
それによるシミュレーション結果をメッセージボックスに文字列で
順次吐き出すだけというものです

※一応Javaも少しかじってます
もし「rubyのGUIは終わってるからJavaでやれ」とかならば
それはそれで結論として構いません

256:デフォルトの名無しさん
08/04/24 00:28:07
際だって使われているGUIツールキットはないと思うが、tkは最初から
付いてくるから比較的メジャーと思われる。
自分はマカーなので、必要な場合はOSに付いてくるRubyCocoaを使う
ことになると思うけど。

Javaもかじってる人ならJRubyでSwing使うというのもアリかね。


257:デフォルトの名無しさん
08/04/24 00:31:29
>>255
FXRuby

258:デフォルトの名無しさん
08/04/24 00:35:52
railsでいいじゃん

259:デフォルトの名無しさん
08/04/24 00:38:22
>>255
URLリンク(www.gesource.jp)
おいらはApollo派


260:デフォルトの名無しさん
08/04/24 00:41:57
配布するのか、自分の特定のマシンで使うのかにもよるよな

261:デフォルトの名無しさん
08/04/24 01:00:03
漏れはRuby/Gtk2
Gnomeだからそれに合わせて。Gladeとかあって使い勝手も悪くない。

262:255
08/04/24 01:07:39
>>260
一応は仕事で補助的に使うツールです
基本は自分のPCで動けばOKですが
状況によっては周囲に配らないとも言いきれませんので
配布時のパッケージングに優れていると助かりますね



263:255
08/04/24 01:09:43
あと、OSはWindowsXPです
今更言う事でもありませんが、念の為…

264:デフォルトの名無しさん
08/04/24 01:12:18
>>255
wxRubyかFXRubyの2択だな

265:デフォルトの名無しさん
08/04/24 01:15:49
VisualuRubyはダメなのかな?
exerbでexe化もできるみたいだし。


てか、ほんと「これだ!」ってのはないと思う。

266:デフォルトの名無しさん
08/04/24 09:48:06
俺AvtiveRubyとHTA

267:デフォルトの名無しさん
08/04/24 10:24:49
HTA+ActiveScriptRubyなんて組み合わせ知ったときには
これぞ俺が今まで追い求めていたものだと直感した
GUIはHTMLで記述、中身の処理はRuby。夢のようだ

なのになんで使わなくなったんだっけ俺

268:デフォルトの名無しさん
08/04/24 13:01:03
インターフェイスはrubyになるけど中身はIEのままじゃねそれ
eachとかProcとかないんじゃ

269:デフォルトの名無しさん
08/04/24 14:45:06
>>247
>>254
xmlrpcやjsonでお互いのプログラム間で通信したらいいのかな?

270:デフォルトの名無しさん
08/04/24 17:24:55
>>255
反則っぽいけどwebrickでアプリケーションサーバを作るとか
guiとかの環境依存性も配布する必要も無い
ついでにdrbで分散処理も追加

271:デフォルトの名無しさん
08/04/25 00:47:28
>>255
>262,263の条件ならC#かJavaがいいと思う。
UNIX系でも使う可能性があるなら>264かな。

272:255
08/04/25 02:51:02
色々候補ありましたが、日本語周りに確証が欲しかったので
差し当たりVisualuRuby触ってみる事にします
皆様レス有難うございました

しかし決め手が無くて色んな種類があるという状態は
選択肢が広いとは言え、個人的には苦手だ…

273:デフォルトの名無しさん
08/04/25 04:29:00
パスが入ってる文字列のファイルセパレーター(/や\)を,
/からwindowsの\に変換するメソッドは有りますか?


274:デフォルトの名無しさん
08/04/25 05:51:48
>>273
文字の置き換えだろ?
リファレンスマニュアルでStringの項を読みなさい

275:デフォルトの名無しさん
08/04/25 23:54:28
文字列の50行目から100行目の範囲に対して、正規表現で検索をしたいのですが
今は
str.split('\n).each do |line|
cnt += 1
line =~ 〜 if(50<=cnt && cnt<=100)
end
のようにしているのですが、strはかなり長い文字列なので、無駄な処理をしている気がします
もっと上手は方法はないでしょうか?

276:デフォルトの名無しさん
08/04/26 00:22:53
>>275
とりあえず、splitする必要ないでしょ

277:デフォルトの名無しさん
08/04/26 00:31:59
>>275
ややトリッキーな方法だが

target_lines = str.split($/).slice(50..100)
if target_lines then
 target_lines.each do |line|
  line =~ 〜
 end
end

278:デフォルトの名無しさん
08/04/26 00:39:05
>>276-277
ありがとうございます

279:デフォルトの名無しさん
08/04/26 10:18:49
>>275

str.each_with_index do |line, cnt|
next if cnt < 49
line =~ 〜
break if cnt >= 99
end

1.9なら
str.each_line.with_index

280:デフォルトの名無しさん
08/04/26 10:32:56
next unless (50..100) === cnt


281:デフォルトの名無しさん
08/04/26 12:00:36
何を無駄って考えてるかによりそう
strが巨大な配列になってるのがヤだっていうならsplitとeachは全滅だな

282:デフォルトの名無しさん
08/04/26 13:58:48
Rubyからコマンドを実行させるには、execとかsystemとかいろいろあると
思うんですけど、出力結果を文字列として取得する場合はどうすればいいんですか?

ちなみにRuby1.8.6です。

283:282
08/04/26 14:01:07
282です。
できればエラーストリームだけとれるのが望ましいです。

284:デフォルトの名無しさん
08/04/26 14:13:05
URLリンク(kazuho.exblog.jp)
>日本のオープンソース開発者の中で有名なまつもと氏のような方ですらライセンス条件について間違った解釈をしてしまうのである


ほうほう。


285:デフォルトの名無しさん
08/04/26 14:49:08
わざわざ自分のブログ宣伝して回るなよ

286:デフォルトの名無しさん
08/04/26 16:24:59
>>282
* Open3 を使う(require 'open3')
* 自分で作る(open3 は簡単だから、読んでみるといい)
* windowsでは動かないかもしれないが↓
command = 'ls /tmp'
stderr = `#{command} 2>&1 > /dev/null`

287:デフォルトの名無しさん
08/04/26 22:55:11
>>282
$stdout, $stderr を reopen して system

system のいいとこは shell を介さずに実行できるから
コマンドインジェクションを防げる。

288:デフォルトの名無しさん
08/04/27 01:40:40
単純にpopenじゃあかんの?

289:デフォルトの名無しさん
08/04/27 10:50:28
ポペン!

290:デフォルトの名無しさん
08/04/27 18:19:04
あのさ、あるクラス Foo があって、その機能強化版をつくったとき、
クラス名は何にしたらいいと思う?
AdvancedFoo とか ExtendedFoo とか考えたけど、あまりいい名前じゃないといわれた。
かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
なんかいい名前ない?

291:デフォルトの名無しさん
08/04/27 18:26:58
追加する機能をモジュールとして作り、
Fooのインスタンスにextendで機能追加する。

↑という方法では解決できず、どうしても継承でやる必要があるなら
FooWith機能名
とか
機能ableFoo
とか。



292:デフォルトの名無しさん
08/04/27 18:30:36
Fooそれ自体に機能(メソッド)を追加するという方法もある。
あるいはモジュールとして作り、includeする。
Fooのインスタンスはどれでも追加された機能を使える。

class Foo
... # 元の定義
end

# 定義を再オープンして機能追加
class Foo
def 追加機能
end
...
end

>>291のextendする方法は、Fooクラスのインスタンス全体ではなく、
Fooの特定のインスタンスだけに機能を追加する方法。


293:デフォルトの名無しさん
08/04/27 18:32:40
クラスに二つ以上の責任があるんじゃないか?
できれば分割して名前を明示できるようにした方がいい

294:デフォルトの名無しさん
08/04/27 19:46:16
>>291,292
もとのFooは残す方向なので(ほかに継承で使っている人がいるから)、Foo自体を拡張するわけにはいかないんです

>>293
まあそうなんですけど、Rubyの大クラス主義でやっているので。
大クラス主義はたしかに便利なんだよね。既存の他のクラスのインターフェース変えなくていいし。

295:デフォルトの名無しさん
08/04/27 20:19:07
>>294
大クラス主義はキッチンシンクじゃないぞ。

>>290
> かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
どうも行き辺りばったりの感じがするんだが。
UtilFooとでもしとけば。

296:デフォルトの名無しさん
08/04/27 20:45:31
Rmagickで書き込もうとする、もしくは書き込んだ文字列の幅と高さを求めるにはどうすれば用でしょうか?

297:デフォルトの名無しさん
08/04/27 21:48:45
>>296
ImageMagickのコマンドから推測するといい

298:デフォルトの名無しさん
08/04/28 19:42:33
Rubyの利点って何?
Javaプログラマの俺にわかりやすく説明して

299:デフォルトの名無しさん
08/04/28 19:55:52
状況も設定せずに利点を挙げろつってもなぁ。
まずは自分の疑問をわかりやすく説明しる。

300:デフォルトの名無しさん
08/04/28 20:02:49
適当な捨てプロ書くのに凄く楽。

301:デフォルトの名無しさん
08/04/28 20:09:52
>>298
君にとって利点はないと思うよ

302:デフォルトの名無しさん
08/04/28 20:37:12
気楽に楽しくプログラミングできる

303:デフォルトの名無しさん
08/04/28 20:37:35
>>301
その返し方は誤解を与えるかもな。
ほとんどの人にとって利点はないと答えたかったんだろ?

304:デフォルトの名無しさん
08/04/28 21:00:15
>>300
それあるなぁ。
ワンライナーも併せて便利

305:デフォルトの名無しさん
08/04/28 21:10:58
>>303 一人で納得してれば

306:デフォルトの名無しさん
08/04/28 21:51:50
rubyで大枠の処理を書いて、細かいところはJavaを呼び出す

307:デフォルトの名無しさん
08/04/28 22:09:01
JRubyでうんたらかんたらできる。
初期起動がかなり遅いけど。

308:デフォルトの名無しさん
08/04/28 22:36:39
Rubyの利点って何って話だけど、
それよりむしろJRubyの利点が知りたい。

309:デフォルトの名無しさん
08/04/28 22:38:33
JRubyの利点ってJavaのクラスが呼び出せるとかじゃないのかな。
これができると膨大なJavaのライブラリも使えるし。

個人的にはSwingあたりのGUIライブラリが楽に使えるとありがたい。


310:デフォルトの名無しさん
08/04/28 22:40:57
大量にあるJavaの資産が使えるのがありがたい
標準のライブラリだけで大抵のものが一揃いして、もちろん完成度も高め。Swingもあるし

311:デフォルトの名無しさん
08/04/28 22:47:59
>>309
>>310
へー、そうなんだ!
JAVA屋さんには便利なのかな

そういえばIronRubyはどうなったんだろう

312:デフォルトの名無しさん
08/04/28 22:55:35
>>308
(顧客の)サーバにRubyのバイナリを入れるのは(政治的な意味で)非常に大変だが、
Javaはデフォで入ってるので、jarを1個放り込めばよいJRubyは非常にありがたい。


313:デフォルトの名無しさん
08/04/28 23:12:25
>>312
その発想はなかった!
業務で使ってる人は大変なのね

314:デフォルトの名無しさん
08/04/28 23:40:01
>>312
これあるよねー
unzipコマンドがない客先のサーバでzipファイルを解凍しなきゃいけなくて
さてどうしようと思ってたら、jarコマンドで解凍できた。
このときはjavaすげーとおもった。

315:デフォルトの名無しさん
08/04/29 00:18:07
rubyの開発者
凄い人なんだろうけど、あらゆるruby本の監修になって名前貸すだけで稼ぎまくってるあの魂胆が嫌いだ

316:デフォルトの名無しさん
08/04/29 00:20:36
成果をねたむ足引っ張り合い好きな国民性丸出し
トイレ掃除でもしてろ

317:デフォルトの名無しさん
08/04/29 01:24:23
俺はUSBメモリにruby.exeとmsvcrt-ruby18.dllが入ってるな(他は grep sed)。
これだけでもコマンドプロンプトのお供に使えるところが好き。

Python はライブラリ無いと起動すらしないし、Perl は動くけど glob が使えねえし…。

318:デフォルトの名無しさん
08/04/29 02:03:04
監修料なんて雀の涙だろ。


319:デフォルトの名無しさん
08/04/29 02:15:01
 ヾヽヽ
 (,, ・∀・)チュンチュン
  ミ_ノ
  ″″

320:デフォルトの名無しさん
08/04/29 02:28:02
>>318
どっかの年金では図柄変更バージョンごとに1千万とからしいけど。
図柄かえるだけのバージョンが100くらいある。


321:デフォルトの名無しさん
08/04/29 03:18:35
監修料がわずかって…何を見て言ってんだ?
有名人になると筆者より儲けてるよ

322:デフォルトの名無しさん
08/04/29 03:32:49
何を見て言ってんだ?

323:デフォルトの名無しさん
08/04/29 03:38:27
どぞー
スレリンク(tech板)

324:デフォルトの名無しさん
08/04/29 06:20:24
>>317
やあ俺
シェルと好みのエディタ入れれば、簡易開発環境が出来てしまうのが便利だ

325:デフォルトの名無しさん
08/04/29 08:13:17
>>321
具体例をドゾー

326:デフォルトの名無しさん
08/04/29 09:43:14
>>321
監修するなってこと? なんで? そのメリットは?
「成功者の収入が減ると、貧乏人の俺の胸がすく」という以外のメリットを感じないけど・・・。

327:デフォルトの名無しさん
08/04/29 09:53:42
釣られんなよ、おまいら……。

328:デフォルトの名無しさん
08/04/29 10:31:38
まぁ釣りだったことにしたいだろうなぁ、このフルボッコな状況じゃ。

329:デフォルトの名無しさん
08/04/29 12:53:29
>>320
さすがに公共事業とは事情が全く異なるだろ。
そういうのはまた孫受け曾孫受けで政治家とか○暴とかの
たかり屋に流れるからその分割高だし。

330:デフォルトの名無しさん
08/04/29 13:31:36
ちょっとした質問です。



・・・忘れた

331:デフォルトの名無しさん
08/04/29 13:34:16
すいません、思いだしました!

Rubyで小物でもプログラムを書くときに、
クラス化しますか?
適当に書き下す(とは言っても100行オーバーの大きさ)場合はトップレベル関数ばりばりでも
よいと思うのですが、関数作りまくるプログラミングタイプだと、
いちいち関数化時に変数をグローバルにするのが面倒です。
また、配布とかも考えると、クラス化してライブラリとして使えるようにも、と思ってしまいます。

あなたはどうしてますか?

332:デフォルトの名無しさん
08/04/29 14:01:16
うぜぇw

333:デフォルトの名無しさん
08/04/29 14:02:37
配布を考える場合は、規模問わずほぼ確実にクラス化(モジュール化)する

配布を考えないなら、そのときどき
トップレベル関数(メソッド)から作り始めることもあれば
クラスの設計から始めることもある

ところで
>いちいち関数化時に変数をグローバルにするのが面倒です。
これはどういう意味なんだ

334:デフォルトの名無しさん
08/04/29 14:19:14
この俺がエスパーしよう!

name = gets.chomp
hello = 'ぐっもーにん'
puts "#{name}さん、#{hello}"

をメソッドにすると

def say_hello
puts "#{$name}さん、#{$hello}"
end

$name = gets.chomp
$hello = 'ぐっもーにん'
say_hello

と書かなければならなくなって面倒だとか、たぶんそういう話だ!

335:デフォルトの名無しさん
08/04/29 14:33:57
トップレベルは気持ち悪いからなんでもクラス化

336:デフォルトの名無しさん
08/04/29 14:35:08
とりあえず関数だけで書いて
複雑になってきたらリファクタリングしてクラス化

337:デフォルトの名無しさん
08/04/29 14:42:55
100行くらいなら、多分関数のみ

338:デフォルトの名無しさん
08/04/29 14:47:37
メソッドのことを関数と言ってる奴は同一人物

339:デフォルトの名無しさん
08/04/29 15:12:32
>>333
>>いちいち関数化時に変数をグローバルにするのが面倒です。
>これはどういう意味なんだ

>>334 そのとうりです!!

>>338
トップレベルメソッドというべきでしたか?

340:デフォルトの名無しさん
08/04/29 15:59:49
確か三年ぐらい前に、初心者だった自分も同じようなことを言われたんだが
グローバル変数の使用はお薦めしない(書き捨ての短いコードだとしても)
エスパー>>334の例を借りると

def say_hello(name, hello)
 puts "#{name}さん、#{hello}"
end

say_hello(gets.chomp, 'ぐっもーにん')

こんな風に引数として渡したほうがいい


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4703日前に更新/261 KB
担当:undef