Ruby 初心者スレッド ..
[2ch|▼Menu]
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, 'ぐっもーにん')

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

341:デフォルトの名無しさん
08/04/29 16:47:55
いくらなんでも324はないだろう

def init(opt)
$_option = opt
end
def exe(arg)
if $_option[:foo]

end

init :foo => :bar
exe "hoge"


とか?

342:デフォルトの名無しさん
08/04/29 16:53:28
俺の場合は新規作成した場合、自然と指が

class

って動いちまうなあ。

343:デフォルトの名無しさん
08/04/29 17:03:15
Pythonと比べるとRubyの方が直感的だと感じてしまうのはRubyに毒されたからなのか。
yieldの書き方とかはRubyの方がいいな。

344:デフォルトの名無しさん
08/04/29 17:06:54
コルーチンがわかってないんだろ

345:デフォルトの名無しさん
08/04/29 17:35:41
>>342
毎回指で書くなら自動化すればいいじゃない

346:デフォルトの名無しさん
08/04/29 17:47:28
これがコルーチンか。そう意識してみるとPythonの書き方もこれでもいいかと思えてくる。
でもRubyの方がコルーチンを中断している途中でなんか処理しているってイメージがしやすい気がする。
気のせいか慣れなのかもしれないけど。

347:デフォルトの名無しさん
08/04/29 22:15:27
メソッド・オーバーライトって、具体的に、どんなときに使ったことありますか?

348:デフォルトの名無しさん
08/04/29 22:31:43
ライブラリのメソッドを上書きしたいとき

349:デフォルトの名無しさん
08/04/29 22:49:20
それはわかるんだけど、具体的にどんなメソッドを上書きしたの?

350:デフォルトの名無しさん
08/04/29 23:10:38
inspect はしょっちゅうオーバーライドしてるなあ。
あと to_s も。

351:デフォルトの名無しさん
08/04/29 23:49:21
>>349
OKまずはageだ

・自分で設計したクラスのサブクラスを作ったとき(基本)
・他所から持ってきたライブラリのバグを自分で直すとき
・ライブラリの挙動を少しいじくったり、機能を足したいとき(たいていサブクラスを作って上書きする)

上書きコードがある程度の量になってきたら、自分用のラッパーライブラリを作ることもある

352:デフォルトの名無しさん
08/04/30 00:41:49
再定義はオーバーライト(overwrite)じゃなくてオーバーライド(override)だな。


353:デフォルトの名無しさん
08/04/30 01:19:44
そういえば、Object#inspectって循環参照があるオブジェクトに対してもちゃんと動くよね
これってどうやって検出してるんだろう。inspectは特に引数を受け取るでもないし

354:デフォルトの名無しさん
08/04/30 07:48:36
>>353

Thread.current[:__inspect_key__] でobject_idを覚えてる。

355:デフォルトの名無しさん
08/04/30 09:26:26
>>354
スレッドローカルストレージ使っているのか。なるほど。
353じゃないが参考になった。
これからもあわあわと質問に解凍しやがってください。

356:デフォルトの名無しさん
08/04/30 11:34:29
>>354
そういうことかー。返答ありがとう。

357:デフォルトの名無しさん
08/04/30 18:32:29
javaが呼べるのは便利そうだけど
c++(cじゃなくて)の呼び方がまとめてあるサイトないですか?

358:デフォルトの名無しさん
08/04/30 19:38:33
railsでないRubyではDB操作するのに何が一番使われてますか?
素のライブラリ?DBI?ActiveRecord?

359:デフォルトの名無しさん
08/04/30 23:38:38
O/R MapperならActiveRecordかDataMapper
そうでなければDBIかMySQLライブラリ直書き

360:デフォルトの名無しさん
08/05/01 00:28:23
activerecordだけ使うならrailsでやればいいのに
って思う。

361:デフォルトの名無しさん
08/05/01 00:31:00
「Rails使うならActiveRecord使えばいいのに」なら分かるが
その逆はイミフだなぁ。


362:デフォルトの名無しさん
08/05/01 17:18:14
initializeを勝手に呼び出すのは良くないんでしょうか。

class Foo
  ...
  def refresh
    initialize
  end
end

363:デフォルトの名無しさん
08/05/01 17:38:07
よくないです

っていうか、そういうような処理を initialize に書いたらダメです
たとえば、別途セットアップ系のメソッドを作って、initialize と refresh から呼ぶようにするとかしてください

364:デフォルトの名無しさん
08/05/01 18:32:18
>>363
なんでよくないの?

365:デフォルトの名無しさん
08/05/01 19:28:22
>>340
あー、わかります。

でもRubyは参照渡し?できないですよね。

単発なら返却値で返す。
複数の返却値だとタプル?じゃなくて配列で返して、
 hoge, mage = gethogemage
でよかったと思うんですが、なれてないと妙に気持ち悪いw
みんなこんなのやってんのかな

>>342
まず体を慣らすのはいいかもですねw

私も一番慣れてる言語だと、ファイル新規作成したら無意識でclass構文が書けます(まあ大抵はスニペット使いますけど)

366:デフォルトの名無しさん
08/05/01 22:27:49
>365
Rubyはむしろ全て参照渡しと言っても良いくらいなのだが。

ただし代入(=、+=など)は変数の参照先を変えてしまうので
自身を書き換えるメソッドを使わず代入で書き換えようとした場合
変数の参照先が変わり、値渡しみたいに見える。

例えば文字列なら concat は文字列自身を書き換えるが
+= は新しい文字列を作り変数の参照先を書き換えるので元の変数に影響がない。

FixnumやSymbolなどは、自身を変更するメソッドを持たないので
実質的に値渡しになる。

367:デフォルトの名無しさん
08/05/01 22:29:19
>>364
べつにいいと思うよ、何度呼ばれてもいいように設計されていれば。
foo = Foo.new(0) # Foo#initialize(0) が呼ばれる
foo.do_something!
foo.initialize(0) # リセットする
foo.do_something!
foo.initialize(0) # リセットする
...

もちろん>>363のようにしてもいい。すきにどうぞ。


368:デフォルトの名無しさん
08/05/01 23:57:27
正規表現でCの文字列リテラルにマッチするようなのって書けないでしょうか?
/".*?"/にすると"aaa\"bbb"みたいな場合に"aaa\"で終わってしまいますが全体にマッチして欲しいんです
/".*(?<!\\)"/にしようと思ったら1.8では(?<!)が使えませんでした

369:デフォルトの名無しさん
08/05/02 00:03:40
"([^"]*?\\.)*.*?"
とかよく書くけど、どうかな

370:デフォルトの名無しさん
08/05/02 00:12:20
/"([^"\\]|\\.)+"/
こんな感じ?

371:デフォルトの名無しさん
08/05/02 00:28:07
>>369 >>370
どちらでもいけました、ありがとうございます!
なんでこれでいいのかまだ良くわからないので頑張って解読します

372:デフォルトの名無しさん
08/05/02 02:12:18
>>371
/"[^\\"]*(\\.[^\\"]*)*"/

こっちのほうが早いかな。

詳説 正規表現を読むのをオススメするよ

373:デフォルトの名無しさん
08/05/02 02:15:20
db等の外部リソースを使った時は
Rubyの終了時にメモリは自動的に解放されているのでしょうか?
明示的に解放しないとだめですか?

374:デフォルトの名無しさん
08/05/02 03:21:27
ここでいいのか不明なのですが…もし良ければおしえてください

やりたいことは
CarbonEmacs上にて起動したirbで
require 'rubygems'
を行いたい。です。

環境は
OSX10.4にてCarbonEmacs2008春版を使用しています。
rubyはMacPortsからインストールしたものを使用し、
rubygemsもMacPortsからインストールしました。

375:374
08/05/02 03:23:56
以下Terminal.appから実行した結果です
/Users/hoge% uname -a
Darwin hoge.local 8.11.1 Darwin Kernel Version 8.11.1: Wed Oct 10 18:23:28 PDT 2007; root:xnu-792.25.20~1/RELEASE_I386 i386 i386
/Users/hoge% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1]
/Users/hoge% which ruby
/opt/local/bin/ruby
/Users/hoge% gem -v
1.1.1
/Users/hoge% which gem
/opt/local/bin/gem
/Users/hoge% echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
/Users/hoge% irb
irb(main):001:0> puts $:
/opt/local/lib/ruby/site_ruby/1.8
/opt/local/lib/ruby/site_ruby/1.8/i686-darwin8.11.1
/opt/local/lib/ruby/site_ruby
/opt/local/lib/ruby/vendor_ruby/1.8
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin8.11.1
/opt/local/lib/ruby/vendor_ruby
/opt/local/lib/ruby/1.8
/opt/local/lib/ruby/1.8/i686-darwin8.11.1
.
=> nil
irb(main):002:0> require 'rubygems'
=> false
--------
rubygemsをrequireしてもエラーになりません。
(.irbrcにてrequire済なので再読み込みはしませんが)


376:374
08/05/02 03:25:02
対してCarbonEmacs上のrun-rubyにて起動したirbでの実行結果です
irb(main):001:0> puts $:
/usr/lib/ruby/site_ruby/1.8
/usr/lib/ruby/site_ruby/1.8/powerpc-darwin8.0
/usr/lib/ruby/site_ruby/1.8/universal-darwin8.0
/usr/lib/ruby/site_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/powerpc-darwin8.0
/usr/lib/ruby/1.8/universal-darwin8.0
.
nil
irb(main):002:0> requrie 'rubygems'
NoMethodError: undefined method `requrie' for main:Object
from (irb):2
--------
実行時のパスが異なるようです
どのようにしたら、この問題を解消できるでしょうか。

377:デフォルトの名無しさん
08/05/02 03:33:48
うん、そのtypoは俺もよくやるよ

378:374
08/05/02 03:52:32
>>377
まちがえました…ご指摘ありがとうございます
typoしなくても以下の通りです

irb(main):001:0>
No such file to load -- rubygems
from (irb):1:in `require'
from (irb):1



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

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