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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
352 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:39:17 ] つーかWinでHpricotのインストールが難しいってどういうこと?
353 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:45:52 ] >>352 難しくなかった人はたまたま最新バージョンに Win バイナリがあった人 最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない これは gem update のアップグレードが悲惨
354 名前:350 mailto:sage [2008/12/10(水) 07:36:46 ] >>351 やっぱりプロジェクトが活発でなくなるとHpricotみたいにバイナリを用意してもらえず 難しくなるかなぁ… 自分は今のところgemで一発でした。
355 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 17:15:59 ] バイナリを用意してもらえなくなったら、自分が用意する番だよ。
356 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 18:29:46 ] irb に --noinspect をつけると、式の結果を inspect するのを やめさせることができますが、同じことを irb のプロンプトから 行うことはできますか。 irb を使ってて、inspect による評価を一時的にやめさせようと しています。 irb> IRB.conf[:INSPECT_MODE] = false とかしてみましたけど、かわりませんでした。
357 名前:328 mailto:sage [2008/12/10(水) 18:43:11 ] >>329 ありがとうございます。安心しました。 あと、数百のファイルをコピーする時、 ファイル名を一つ一つ変更したいのですが、 それも可能でしょうか? 名前を一つ一つ打ち込めばできますが、 ファイルの数が数百もあるので、 正規表現で置換するような形でリネームしたいのです。 「コードが一行で済まないかな」と思っています。
358 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:02:26 ] >>356 IRB.conf[:MAIN_CONTEXT].inspect_mode = false >>357 どういうファイル名をどのように変えるのかがわからないとなんとも。 あと一行でっていうのは、やればできるんだろうけど いわゆる玄人御用達だからオススメしない。
359 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:15:12 ] >>358 やってみましたが、かわんないです。 あいかわらず inspect の結果が表示されます。
360 名前:デフォルトの名無しさん [2008/12/10(水) 19:21:59 ] ruby -i ky_*.txt -pe '$_.sub!(/麻生太郎/, "阿呆太郎")' *.txt で動くかもしれない。
361 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:30:59 ] >>359 やりたいのは--noechoじゃない? IRB.conf[:MAIN_CONTEXT].echo = false
362 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:21:39 ] >>357 御返事ありがとうございます。 元ファイル名は大体このような感じです。 hoge_428_20-01.txt hoge と数字の部分が違っているものが数百ほどあります。 それを別のディレクトリにコピーする時に、 index_428_20-01.tex というような形に変えたいのです。 先頭と拡張子の部分を置換する格好になります。 置換を正規表現で表現すると次のようになります。 検索 [a-z]+([\d_\-])+\.txt 置換 index\1.tex このようなリネーム処理を、 ファイル(ディレクトリ)コピー時に同時に行いたいのです。
363 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:24:33 ] >>361 びんごです! さすが特務エスパー、多謝です
364 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:27:48 ] >>362 だからできるっつの めんどくさいので、対象ファイルの指定も実際のコピーもRubyでやれ これらを外部から読み込むように作ろうとすると敷居が微妙に高い より正確に言うと変なものが混じったときのエラー処理がめんどい
365 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 09:33:52 ] >>362 これを参考にしてみて。 require 'fileutils' from = /[a-z]+(¥d_¥-])+¥.txt$/ to = 'index¥1.tex' filenames.each do |filename| new_filename = filename.sub from, to FileUtils.mv filename, new_filename if filename != new_filename end >>364 役立たずなレス 初心者の相手ができないならくんなよ
366 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:31:12 ] def func a = ["hage","hoge","hage"] a.each{|elem| return true if elem="hoge" } return false end 上記のようなコードを書くと、funcの返り値が[false,true,false]になってしまうのですが、 trueひとつにしたい場合はどのようにしたらよいでしょうか
367 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:36:25 ] >>366 ごめんなさい、これ勘違いだったので見なかったことに
368 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:37:11 ] >>365 のスクリプトがキモい件について
369 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:50:06 ] Ruby式ではないな 他の言語の人間だ
370 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:19:31 ] 初心者にあんま見せたくない書き方であることは間違いないね…
371 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:23:39 ] htmlデータからタグの間に挟まれた文字のみ取り出すにはどうすればいいですしようか。 タグ名もバラバラです。 例 <b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow> タグごと取り出す方法は分かったのですが。
372 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:28:04 ] >>365 をrubyらしくってどう書けばいいの? rename_rule=[..., ...] def mkdistnme file x.sub *rename_rule end def movefile from, to ... end filenames.map{|x| [x, mkdistnme x]}.each{|ft| movefile *ft}
373 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:41:37 ] >>371 hpricotとかでパースするのをオススメしたいけど 慣れるまでが難しいかも知れない。 ネスト構造無視でいいなら str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>" ary = [] str.gsub(/<.+?>(.+?)<\/.+?>/){ary << $1} gsub使うのに違和感あるから、もっといい方法があるかも?
374 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:02:02 ] >>371 deleteの動作(主に返り値)に注意 str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>" arr = str.split(/<.+?>/) arr.delete('') puts arr 殿様カエル しり上がり 自転車 HTMLとしてパースするのが真っ当
375 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:09:31 ] >deleteの動作 そういえばなんでArrayの一部メソッドは破壊的な操作をするのに !がついてないんだろう。perl由来の名残のような気もするけど ary = [].push data [].push! data と書きそうになることがよくある。
376 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:34:18 ] a = [1,2,3] b = [4,5,6] a.each{|i| puts i} b.each{|i| puts i} とやると 123456 の順に表示されますが a.calleach b.calleach puts "A" a.calleach puts "B" b.calleach a.calleach puts "C" b.calleach のようにeachの各ループが実行されるタイミングを自分で制御してこの例では 14A2B53C6 という順で出力されるようなイテレータの書き方というか呼び方あったら教えてください。 自分でインデックス変数も合わせて用意すればいいんでしょうが もう少し簡潔なのがあれば嬉しいです。
377 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:44:16 ] >>376 それはプログラム構造そのものが間違っている 絶対にあとで破綻するから、いまのうちに書き直せ で、その時間がないという場合は、配列をキューとみなして使う a.shift b.shift puts "A" a.shift puts "B" b.shift a.shift puts "C" b.shift
378 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:47:21 ] >>376 1.8ならGenerator、1.9ならEnumeratorがそんな感じだけど 推測するにEnumerable#zipで十分なんじゃないかな [1,2,3].zip([4,5,6], ["A","B","C"]) {|ary| puts ary }
379 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:47:42 ] >>376 継続とかcall/ccとかコルーチンとかだっけ。 require 'generator' g = Generator.new([1,2,3]) g.next
380 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:50:28 ] 外部イテレータ ね
381 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:02:39 ] >>375 !は「破壊的」という意味ではない。 !の意味は、それが付かない同名メソッドと比較して、注意すべき挙動の違いがある、という意味。
382 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:17:24 ] >>381 二種類提供する場合のみってことか。サンクス。 ttp://shugo.net/ruby-codeconv/codeconv.html >破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、 >破壊的なメソッドには`!'を付ける。 ttp://www.ruby-lang.org/ja/man/html/FAQ_A5E1A5BDA5C3A5C9.html#a5.2e12.20.c7.cb.b2.f5.c5.aa.a5.e1.a5.bd.a5.c3.a5.c9.a4.c8.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab >同名のメソッドがあって、一方はオブジェクトのコピーを作って返し、 >もう一方は変更されたオブジェクトを返すようになっている場合、 >!のついた方が破壊的メソッドです。ただし、!がつかないメソッドの中にも >String#concatのように破壊的なものはあります。
383 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:52:51 ] >>365 ありがとうございます。 Rubyは初心者ですが、頑張って使いこなせるようになりたいです。
384 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 19:45:42 ] >>365 正規表現まちがってる。 >from = /[a-z]+(¥d_¥-])+¥.txt$/ from = /[a-z]+([¥d_¥-]+)¥.txt$/ あるいは from = /¥w+([-_¥d]+)¥.txt$/ とか。[a-z]+ はたぶん ¥w+ で済むんじゃないか。 >>372 十分 Ruby らしいと思うけどね。負け惜しみだと思うよ、>>368-370 は。
385 名前:デフォルトの名無しさん [2008/12/11(木) 19:59:40 ] 質問です。 Rateというクラスをインスタンスにして配列にしたいのですが、 @rates = Array.new(Rate.new) と書くと、 can't convert Rate into Integer というエラーメッセージが帰ってきて配列に出来ません。 どのようにすれば、インスタンス化したクラスを配列に出来るのでしょうか?
386 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:04:42 ] >>385 www.ruby-lang.org/ja/man/html/Array.html#Array.2enew newの第一引数は整数か配列。 というわけで @rates = [ Rate.new ]
387 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:06:10 ] >>384 $は文字列末尾じゃないぞ。
388 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:15:42 ] Array#zip は、引数のほうが長い場合は残りを無視するようですが、 これを無視しないようなオプションとかありますか。 コード: ['A','B'].zip([1,2,3,4]) {|c, i| puts "#{c}, #{i}" } 結果: A, 1 B, 2 希望: A, 1 B, 2 nil, 3 nil, 4
389 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:20:23 ] >>388 [1,2,3,4].zip(["A","B"]).map{|i| i.reverse}
390 名前:385 mailto:sage [2008/12/11(木) 20:25:26 ] >>386 ありがとうございます!
391 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 21:18:17 ] Ruby の作成環境の表示文字エンコードってどれが一番多いかな? やっぱまだ EUC-JP? サンプルの日本語の puts のデフォルトを UTF-8 にしたいんだけど…
392 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 21:36:58 ] Windows環境でShift-JISの俺に隙はなかった 本当、端末の文字コード何とかならないかな 文字化けが不便なためにrspecのit 〜を日本語で書けない
393 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 21:52:54 ] # HTMLのタイトルを表示 puts html.scan(/<title>(.+?)</title>/) では不足なんだよね このあとに .toeuc とか .toutf8 とか書かないと化ける 化けるならまだしも、変なエスケープシーケンスがどうたらで方向キーとかが動作しなくなる 端末リセットしても直りゃしねえ
394 名前:デフォルトの名無しさん [2008/12/11(木) 21:53:59 ] >>374 >>373 ありがとうございます。 split(/<.+?>/) の前にgsub(/<[^\/].[^>]*>/,"")をかませたらいい感じになりました。 splitの指定が正規表現できるとは初めて知りました。
395 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 21:54:45 ] そのへんは端末エミュレータの仕事だとも思う 日本語EUCでもUTF-8でも半角2バイト文字でもてきとーに表示するのが端末の仕事だろ 一緒に化けてどうする
396 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:41:16 ] >>395 無茶言うなよ……。一度エンコーディング自動識別のコード書いてみろ、絶望的な気分に浸れるから。
397 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:47:01 ] hoge.rb|nkf -Lu -wとか
398 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:50:00 ] >>393 inspectでお茶濁していいんじゃない? どのみちその程度の文字コード知識はないとHTMLなんて扱えないから 説明が必要になるでしょ。
399 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:56:38 ] 別に普通に書けたけどな。 JIS, SJIS, EUC-JP, UTF16 自動認識。
400 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:01:48 ] 端末エミュレータが自動で標準出力に nkf -端末エンコード をかませばいいじゃん nkf 自動認識が失敗したらなにか出力バッファに対して再試行できる仕組みにしてさ Emacs が 文字コード指定して開き直せるのと同じような感じで こういうときは us-ascii で済んでる人間が憎いなあ
401 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:21:56 ] >>399 どんなデータでもその自動認識が正しく動作するならおまえは天才だ
402 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 01:25:25 ] >>389 ありがとうございます。 でもこの場合、引数のほうが長ければ>>389 のようにする、ということですよね。 そういうのが面倒だったので、zipにオプションがないかなーと思って質問してみました。 ないようならあきらめて>>389 のようにします。
403 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 02:19:09 ] >>402 先頭の要素が不足する配列って、明示的にnil入れてあることが多いしね。 zipが複数の配列を引数に取ることを思い出して作り替えてみた。 眠いから間違ってるかも。 def Array.zip2(*ary) size = ary.map{|i| i.length}.max top = ary.shift.dup top[size-1] = nil if block_givin? top.zip(*ary){|a| yield a} else top.zip(*ary) end end
404 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 02:31:14 ] >def Array.zip2(*ary) やっぱ間違ってた、self使ってないorz def zip2(*ary)ということでひとつ・・・。
405 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 02:36:23 ] 配列の全内容を変数(String)に入れる簡単な方法はありますか?。 gsubの結果を1つの変数にまとめてgsubにかけようとしたら、 aa = bb.scan(/.+/) *as = aa cc = as.gsub(/m/,"") こんな感じにしても「配列Array」だといわれてエラーで止まってしまいました。
406 名前:デフォルトの名無しさん [2008/12/12(金) 02:37:05 ] 訂正 scanの結果を1つの変数にまとめてgsubにかけようとしたら、
407 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 03:16:27 ] to_s
408 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 07:11:21 ] >>405 joinでいいような。 ['aaa', 'bbb', 'ccc'].join #=> "aaabbbccc"
409 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 07:12:17 ] to_sは1.9系からinspectっぽくなるからおすすめしない。
410 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 07:37:25 ] ブロックの存在忘れ去られている scan (´・ω・) カワイソス aa = bb.scan(/.+/){|match| match.gsub(/m/,"")}
411 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 12:39:25 ] tDiaryとHikiを使ってるんですけど、これはRuby1.9に対応していますか。
412 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 12:59:52 ] Ruby1.9はまだ使わないでください。
413 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:04:54 ] エラーが出ても自力で対処できないしな… Ruby側が修正されるかライブラリ側が修正されるかするまで全く動作しないとかいうのは ただ利用したいだけの一般ユーザーの身ではやってられん が、開発とか覗いてみたいなーと考えてる人なら、1.9上で動かしてみてエラーのレポートとかしてみるといいかも 1ヶ月くらいじーっとROMってれば雰囲気はわかるしさ
414 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:05:51 ] >>412 いやいや、rc2なんだから使ってもらうべきだろ。
415 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:06:24 ] >>405 一つの変数には一つのオブジェクトしか入れられない。 だから複数のオブジェクトを入れられるArrayオブジェクトを器にするか 結合して一つのStringオブジェクトにするしかない(>>408 )。 gsubしたあとにまたバラバラの文字列である必要があるなら 結合すると分割がめんどうだから aa = bb.scan(/.+/) cc = aa.map{|s| s.gsub(/m/,"")} で配列の各要素に対してgsubをする。 やってることは結果的に>>410 と同じだけど、Array#map(Enumerable.map)は 覚えておいて損はない。
416 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:19:55 ] >>414 お前のような奴がいるからFirefoxは
417 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:22:09 ] Rubyはバグ報告サポートがまだヘナチョコだからなー SEGVが出た時点でエラー情報送信ウィンドウが出るくらいじゃないと開発者以外に勧めたらあかんと思う
418 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:35:43 ] 一般ユーザーは偶数安定バージョンの2.0待ちが無難だよ。
419 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 13:59:05 ] >>417 dumb端末で使ってるやつもいるんだぞ!
420 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 14:03:05 ] >>419 本当? ふつう端末エミュレータかコンソールじゃないの? 今どきシリアル端末なんて管理者だって使わないだろ。 つうか vt100 だって、ダム端じゃねーぞ。
421 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 14:10:07 ] cursesが動かない環境はとりあえず切り捨てていい そんなの使ってる人は自力で何とかすると思われ
422 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 15:56:53 ] 「44133」を「12時間15分33秒」(の表示に必要な数値)に直してくれるライブラリとかないですかね
423 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:09:20 ] >>422 標準でありそうだが、ないな というか時間オブジェクトってないよね Time::Period クラスとかになるのかな
424 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:16:30 ] >>422 難しく考えなくても、Time.at(44133)のTimeオブジェクトからhms拾えばおk。
425 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:21:13 ] あ、タイムゾーン影響を受けるからTime#utcを忘れずに。
426 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:23:19 ] こんな感じかな? Time.at(44133).getgm.strftime("%H:%M:%S")
427 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:40:14 ] 24時間を超えたらどうすんの。
428 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:51:05 ] >>427 どうしようもないな 日の部分が1を超すかどうかをチェックするしかあんめえ
429 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:54:14 ] そうなると秒数を割り算したほうがわかりやすそうだ
430 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 16:57:59 ] >>407 >>408 >>410 joinで解決しました。ありがとうございます。 aa = bb.scan(/.+/){|match| match.gsub(/m/,"")} もいいですが、今一ブロック処理って理解しきれない部分があって。
431 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 17:02:03 ] >>415 勉強してみます。ありがとうございます。
432 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:18:43 ] あるオブジェクトのインスタンス変数に File オブジェクトがセットされてるとして、 そのオブジェクトが GC されるタイミングでその File オブジェクトは close される?
433 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:22:38 ] あ、それで、もし close されてくれないとして、その場合に、 GC のタイミングで close する finalizer のようなことをする方法があれば教えてください。
434 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:30:47 ] >>432 www.ruby-lang.org/ja/man/html/FAQ_C1C8A4DFB9FEA4DFA5E9A5A4A5D6A5E9A5EA.html#a7.2e11.20.a5.d5.a5.a1.a5.a4.a5.eb.a4.f2close.a4.b7.a4.ca.a4.a4.a4.ce.a4.cf.b5.a4.bb.fd.a4.c1.a4.ac.b0.ad.a4.a4.a4.ce.a4.c7.a4.b9.a4.ac > 参照されなくなったFileオブジェクトは、GCで自動的にクローズされます >>433 blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/3465 require 'finalize' Finalizer.add(obj) でobjがGCされるときにobj.finalizeがコールされる はずだけど使ったこと無いw
435 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:37:48 ] 忘れてた。これも参照のこと。 www.ruby-lang.org/ja/man/html/trap_IO.html それと「objがGCされたとき」にobj.finalizeを呼ぶことはできないのか。 Finalizer.add(file, obj)
436 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:48:00 ] >>434 >>435 ありがとうございます。 明示的に close しないのはあまり行儀が良くないとは思いますが、 それほど扱うファイルが多くない場合には GC に期待しても良さそうですかね。 Finalizer はリファレンスマニュアルに説明が無いですが、 これは使うなという無言の圧力でしょうか・・・
437 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 19:50:26 ] いや、明示的に閉じろよ なんでこの機能に依存するんだよ
438 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:00:19 ] 「ガベコレされる時のフック」はいろいろとヤバい代物だから、 使うのは本当に必要なとき(ってどんなときだろ)のみにすべき。 ファイルのクローズのような処理はガベコレに頼るべきではない。
439 名前:デフォルトの名無しさん [2008/12/12(金) 20:19:45 ] ガベージコレクションはプログラム作成者が意識したらダメよ いい意味でも悪い意味でもな オブジェクトの自動回収だけをさせるべき
440 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:28:12 ] >>437 >>438 自分が一から設計するならそうしたいんですけどね。 hash_table.delete obj みたいなコードがあって、今まで obj はメモリ内で完結するオブジェクトでしたが、 あるとき機能追加で File を持つ obj も扱うようになりました。 これを真面目に close するとすると delete する直前の箇所で、 obj.close if obj.respond_to? :close hash_table.delete obj としたり、 hash_table の初期化をする箇所で class << hash_table = Hash.new alias :__delete :delete def delete obj obj.close if obj.respond_to? :close self.__delete obj end end ... hash_table.delete obj と hash_table を拡張するのは思い付いたんですが、 hash_table 側のコードを変更するよりは、 機能追加する側の obj の方でどうにか (あわよくば GC で勝手に) close できれば そっちの方が変更としてはスマートかな、と思いました。 何か良い方法ありますかね?
441 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:31:31 ] いや、だから、openが終わったときにcloseするか、ユーザーのcloseを受け付けるように作れよ
442 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:42:56 ] Fileオブジェクトを使う人が、そのファイルオブジェクトの責任を持つ ということで、この場合は勝手に消していいと思う obj.open だけして放置する人がいたのなら、それはその人が悪いんじゃないかな
443 名前:デフォルトの名無しさん [2008/12/12(金) 20:48:32 ] ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 死ぬとき このレスの事思い出してから地獄へ行けよ ニヤ(・∀・)ニヤ(・∀・)
444 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:59:19 ] Rubyで特定のファイル群を、 OSで関連付けされたアプリケーションで開きたいのですが、 どうすればよいでしょうか。 一種のとして使いたいのです。
445 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:06:56 ] >>444 Windowsなら、start が使えるはず system('start hoge.txt') cmd.exe の内部コマンドなので注意
446 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:14:40 ] >>440 > 何か良い方法ありますかね? 腐った設計を見直すのが一番いい方法だな >>444 start とか open とか、そのOSで用意されてるコマンドを使う
447 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:15:44 ] >>445 できました! なんという素早く的確なレス! 本当にありがとうございます。ありがとうございます!
448 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 23:47:41 ] rubyでcgiの掲示板みたいな物を 作ろうとしているのですが、 テンプレートとなるHTMLを別に用意して その中の項目などを置き換えて 最終的に表示を行いたいと考えています。 Amrita2 というライブラリが良さげなんですが サンプルなどが少ないんですよね。 (メインのページ?が404で見れない) 他に、同様な機能を持ったライブラリで お勧めなどはありますでしょうか。
449 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 23:56:17 ] めんどいからrdでやっとけ
450 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 00:08:10 ] >>448 Tenjin ってのが速いらしいけど、使ったことないから別にお勧めってわけでもない。 www.kuwata-lab.com/tenjin/
451 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 07:29:20 ] >>448 俺のオススメはTenjinだけど この辺のライブラリはかなり数があるので、いくつか試して目的に合った奴を使うと良いんじゃないかな Rubyist Magazine最新号あたりの記事も参考に ちなみに普通のCGIアプリで使うなら、Amrita2はRubyGemsとHpricotを使っているためオススメできない (というか普通のレンタルサーバ環境ではまず動かない) amrita-alteredの方が良いと思う。ただし動作がかなり重いことには注意
452 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 07:53:50 ] RDとかではめんどいからテンプレートエンジンが隆盛なんだと思う 決定版がないんだよねという話は5年くらい前からしてる気がするが