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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
308 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:33:21 ] >>303 一般的
309 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:37:28 ] Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題 STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり
310 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:48:17 ] rubyでシェル作ればいいのに zshなんてゴミもう捨てたい
311 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:04:56 ] Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい
312 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:11:46 ] ?
313 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:38:31 ] オプション指定とかに拘るからだろ 全部Rubyスクリプト内に入れろ ディレクトリパスとかも直書きだ 不安ならスクリプト内1行目くらいでDir.cdしろ
314 名前:デフォルトの名無しさん [2008/12/09(火) 16:17:01 ] 行き詰ったので再現コード晒します。 どこがまずいのか宜しく apiの使用はアカウント制なのでurl精製工程部分は抜けていますが、アカウントをとって作成してみてください。 たいして掛からずバグエラー吐きます。コロン抜きなどもしてみましたが、だめでした。 #!/usr/local/bin/ruby -Ks # REXML宣言 XMLデータを処理するための require 'rexml/document' # UR.scapeの宣言 サイトにアクセスするための require 'open-uri' # 文字コードを変換するための require 'nkf' # 文字コードをURL用にエンコード require 'uri' $doc counter = 1 while counter != 0 # このキーワードでは1ページ30商品、12ページあるはずなので変数pegenoをpegeno.to_sしてurlに組み込む result = open(楽天商品検索API (version:2008-09-01)でメタルギアをキーワードにしたurl) $doc = REXML::Document.new(result) pegeno = pegeno+1 sleep 1 pegeno = 1 if pegeno == 13 end
315 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:29:34 ] どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが... 一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new して、それだと再現しないわけ?
316 名前:デフォルトの名無しさん [2008/12/09(火) 16:37:25 ] >>315 REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、 エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。 特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。 初心者なので食わすプログラムにヘマてる可能性もありますけど。
317 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:37:52 ] >>314 >>315 も言ってるけど一度ファイルに落としてみて それでも再現するなら、そのxmlをどっかにうpしてほしい。 ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。
318 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:47:56 ] >>316 > 特定のページでもなくて というのは、Document.new の前に p pegeno を入れてみると、 毎回結果が違う、ということ?
319 名前:デフォルトの名無しさん [2008/12/09(火) 17:16:21 ] すいません、それではファイルの読み出しからREXML::Document.newにそのデータを読ませるまでのプログラムを書いてもらえますか。 その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。
320 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:35:53 ] 検索すればいくらでも出てくるだろ・・・ リファレンスちゃんと読め
321 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:38:27 ] open 'ファイル名' do |file| doc = REXML::Document.new file end これだけだが
322 名前:デフォルトの名無しさん [2008/12/09(火) 17:42:06 ] みなさん開発環境はNetBeansですか? それともeclipse?
323 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:43:55 ] お前はnetbeans使ってるんだからそれでいいだろ 他人のことなんか気にするな
324 名前:デフォルトの名無しさん [2008/12/09(火) 18:20:43 ] 今実験してみました。 まず、バグエラー吐いたファイルを >>321 のプログラムで読み込ませて見ましたが、普通に食って Complete(0) って正常終了表示されました。 次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ) もして見ましたが、やはり Complete(0) っと正常終了。 こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。
325 名前:デフォルトの名無しさん [2008/12/09(火) 18:25:44 ] 訂正 まず、バグエラー吐いたページを保存したファイルを
326 名前:デフォルトの名無しさん [2008/12/09(火) 18:40:57 ] 念のため、検索結果1-12ページを保存した後、 >>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。 すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。 何が原因なんでしょうか。
327 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 19:11:11 ] ああ「バグエラー」ってsegvか・・・って、まだやってたのかw ・ファイルに落とすだけならエラーが出ない ・ファイルから読んでREXMLに放り込むだけならエラーが出ない なら、二回ruby起動して別々に処理すればいいんじゃない?
328 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:39:42 ] すみません。ちょっと質問させてください。 色々と試した結果、Rubyを使おうと思っています。 それで、特定のディレクトリのファイルを、 任意のディレクトリにサブディレクトリごとコピーし、 その中のファイルの内容を正規表現で置換し、 その上でファイル名も置換したいのです。 ディレクトリは数十、ファイルは数百くらいです。 こういう処理をショートカット一発でやりたいのですが可能でしょうか? ちなみにWindowsXPです。 また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。
329 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:57:21 ] .rbがRubyインタプリタに関連付けされていれば 「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。
330 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 23:58:26 ] >>314 せっかく再現コードを載せてくれたから試そうとおもったけど、 やっぱりこれじゃわかんないや。 できれば ttp://gist.github.com/ とかにコードを載っけてくれない? あと pegeno は page_no とかにしたほうがいいよ pegeはカッコワルイ
331 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:54:41 ] 記事内の動詞や名詞の数を数えるモジュールもしくはこういうモジュール使ったら実現できるよ というものはありますか? 数え上げるのがどういう技術なのかわからないので検索すらできませんでした
332 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:57:49 ] 形態素解析 でぐぐる
333 名前:デフォルトの名無しさん [2008/12/10(水) 01:07:01 ] すいません、特定の文字を改行に置き換えるにはどのようにすればいいのでしょうか。 変数a1に内容が入っているとした場合、 a1 = a1.gsub(/a1e1ee/,"\n") これだと C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rb15.tmp:412: private method `gsub' called for #<Array:0x2bb23b0> (NoMethodError) エラーを吐くですけど。改行を別の文字に置き換えるのは問題なくできたんですが。
334 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:14:19 ] ちゃんとそのエラーを見てください。 `gsub' called for #<Array:0x2bb23b0> ^^^^^^^^^^^^^^^^^^^^^^^^ a1があなたの期待しているようなStringの値ではないのです。
335 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:17:22 ] >>333 Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。 a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから a1.join.gsub で一つのStringオブジェクトにするか a1.map{|v| v.gsub } で中のStringオブジェクトにひとつづつアクセスしてごらん。
336 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:20:13 ] ここのスレ住人の親切さは異常 レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人
337 名前:デフォルトの名無しさん [2008/12/10(水) 01:26:27 ] >>334 >>335 このエラーメッセージでは分かりませんでしたw みなさんの説明でぴんときました。 最初私はこのようにしていたのですが、 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a1 = a2.gsub(/a1e1ee/,"\n") この時点でa1は配列化したのですね。>a1 = a1.scan(/<Body>.*<\/Body>/) なのでこのように修正したらうまく行きました。 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a2 = a1[0] a1 = a2.gsub(/a1e1ee/,"\n")
338 名前:デフォルトの名無しさん [2008/12/10(水) 01:30:34 ] >>336 すいません、みなさんありがとうございます。
339 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:32:50 ] >>332 ありがとうございます Mecabを入れてMecab-rubyも入れました。まずはMecabとHpricotを組み合わせてみようと require 'rubygems' require 'open-uri' require 'kconv' require 'hpricot' require 'MeCab' doc = Hpricot(open("ameblo.jp/staff/ ").read) doc.search("div.subContents").each{|content| content_html = content.inner_html.to_s.toutf8 content_text = content.inner_text.to_s.toutf8 puts content_html puts content_text puts content_html.split(//).size puts content_text.split(//).size chasen = content.MeCab::Tagger.new("-Ochasen") puts chasen.parseToNode(str) } とやってみたのですが mecabun.rb:17: undefined method `MeCab' for #<Hpricot::Elem:0xb6f501d4> (NoMethodError) from test.rb:8:in `each' from test.rb:8 となってしました。 gemでMecab周辺がそろえられなかったのでどのようなことができるのかわかりませんでした。
340 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:38:03 ] >>339 >chasen = content.MeCab::Tagger.new("-Ochasen") おちつけw
341 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:49:26 ] >>340 すいません mecab = MeCab::Tagger.new("-Ochasen") puts mecab.parseToNode(content) と変えてみたのですがこんどは mecabun.rb:18:in `parseToNode': in method 'parseToNode', argument 2 of type 'char const *' (TypeError) from mecabun.rb:18 from mecabun.rb:8:in `each' from mecabun.rb:8 となってしまいます。
342 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:52:40 ] >>341 p content として、contentの値を確かめてみて
343 名前:341 mailto:sage [2008/12/10(水) 01:56:19 ] parseToNodeではなくてparseでした。エラーは同じでした
344 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:58:03 ] >>341 渡すべきはcontent_textのような。
345 名前:341 mailto:sage [2008/12/10(水) 02:01:41 ] {elem <div class="subContents"> "\n" {comment <!--messageTop-->} "\n" {elem <center> "\343\202\242\343\203〜〜〜3\240\343\201\270 \342\226\240" </a>} "\r\n " </center>} "\n" {comment <!--messageBottom-->} "\n" </div>} という感じでした。 文字コードの設定なんでしょうか?
346 名前:341 mailto:sage [2008/12/10(水) 02:04:30 ] >>344 うまくいきました!!! p content から p content_textでも文字化けでした。
347 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:17:03 ] >>346 p content_text の文字化けはたぶん問題ない puts context_text.class とすれば String になっているはず puts context_text とすれば文字列が表示されるはず
348 名前:341 mailto:sage [2008/12/10(水) 02:41:48 ] >>347 ありがとうございます!文字列表示されました。 動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。 皆さんありがとうございます!
349 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:55:19 ] 俺も>>341 が使ってるhpricotを使ってるけど、nokogiriちゅうのを見かけたんだけど誰か使っている奴いる? hpricotより早いちゅう感じらしいが
350 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 03:14:23 ] mechanizeにHpricotの代わりに使ってる。 なんせWinだとgemでHpricot入れるのが難儀なもんで。
351 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:35:38 ] Nokogiriのインストールがgem一発で簡単であるかのような表現はやめて頂きたく存じ上げ奉り候
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"