Ruby 初心者スレッド Part 23
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/11/20(木) 04:30:21【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.7 の使用をお勧めします】
※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
1.9 の新機能の一部が利用可能なので初学者にお勧めです。
※ただし十分安定しているとは言えないので
プロダクション環境での利用にはお勧めしません。
関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0286デフォルトの名無しさん
2008/12/08(月) 22:47:39>>258
>そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
実際に詰まってるじゃん。
どのマニュアルにもどんな解説にも書いてあるようなことで詰まっているから初心者なんじゃねーの?
もう一度>>255をみてみろ。
>result = open(a2)
>resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、
そりゃ open() の戻り値を代入しているだけなんだから、result.inspect したら #<File:> が入ってるわな。
HTMLの文字列が欲しいのに、Fileオブジェクトがきたので困ってる255さん。あーら困った。
>[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ
え、どこ? >>255のどこに[BUG]って書いているの?
もしかして>>255は>>205と関係しているの?
なんで>>258は>>255の書き込みだけでなんでそんなことがわかるの?
もしかして205=255=258なの?
もしかしてどんな解説にも書いてあるようなことで詰まってしまったの?
0287デフォルトの名無しさん
2008/12/08(月) 22:50:020288デフォルトの名無しさん
2008/12/08(月) 22:58:26それも女の出来そこないって相場が決まってるw
0290デフォルトの名無しさん
2008/12/09(火) 01:05:07やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ
\223\276 って SJISの「得」なんで
そんなのをスクリプトとして解釈しようとするなんて
文字列の閉じ忘れくらいしかない気がする
単純な文字列だけじゃなくて
'〜' とか "〜"だけじゃなくて 正規表現リテラルとか /〜/ とか
%記法の %w(〜) とか %Q(〜) %r!〜! みたいなのも有るんで
%記法だと任意の記号を使えるので注意
しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ
%q a だと'a' と同じ意味
そんなの使ったスクリプトなんて、もはや嫌がらせだが
0291デフォルトの名無しさん
2008/12/09(火) 01:40:27なんかダメもとでスクリプトの先頭に
#!ruby -Ks
と書き足してみるとか。
0292274
2008/12/09(火) 02:15:06「得」は「得点」ですね・・・
ここに載せる際にエラーコードはそのままにhogeにしたのが原因です。すみません。
ちなみにhogeにして実行しても同じでした。
>>291
なんですか!?そのおまじない!w
書き足しただけでエラーコードに変化がありました。
C:/ruby/mysrc/rb81.tmp:61:in `method_missing': save (WIN32OLERuntimeError)
OLE error code:800A03EC in Microsoft Office Excel
Workbook クラスの Save プロパティを取得できません。
HRESULT error code:0x80020009
例外が発生しました。 from C:/ruby/mysrc/rb81.tmp:61
Complete(1)
Saveがおかしい訳じゃないはずなので他に何かあるんでしょうね・・・
それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、
excel = WIN32OLE.new('Excel.Application')の下に
WIN32OLE.const_load(excel, ExcelConst)を追加しました。
これがないと「ExcelConst::」の位置でエラーになるようです。
0293274
2008/12/09(火) 02:20:35あとモジュール定義の所
module Excel
end
から
module ExcelConst
end
に変更しています。
0294291
2008/12/09(火) 02:32:05rubyに-Ksオプションを付ける(shebangっぽく>>291でもOK)と
rubyもSJISで書かれたスクリプトだと承知して字句解析する。
リファレンスを引くなら$KCODEあたりがとっかかりだろうか。
0295デフォルトの名無しさん
2008/12/09(火) 02:48:40>excel = WIN32OLE.new('Excel.Application')の下に
>WIN32OLE.const_load(excel, ExcelConst)を追加しました。
>これがないと「ExcelConst::」の位置でエラーになるようです。
それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。
なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら
もうちょっとちゃんと真似したようがよいと思います。
0296デフォルトの名無しさん
2008/12/09(火) 02:49:44./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from hpri.rb:5
gem environmentでGEM PATHSの部分が
- /usr/lib/ruby/gems/1.8
- /home/XXXXX/.gem/ruby/1.8
となっていてユーザディレクトリが含まれているのが怪しいと思うのですがここの設定を変えることはできるのですか?
0297274
2008/12/09(火) 03:03:27なるほど。説明ありがとうございます。
「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。
それと自己解決しました!
>>292のエラーコードの通りsaveプロパティの問題でした。
グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想)
saveAsで上書きしたらうまく行きました。
>>295
スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。
レス、指摘くれた方々ありがとうございました。
おかげさまで無事動かせました。
0298デフォルトの名無しさん
2008/12/09(火) 03:12:30カレントディレクトリにhpricot.rbというファイルがあって
それがrequireされているのではないでしょうか。
0299デフォルトの名無しさん
2008/12/09(火) 03:30:35BINGOです!お恥ずかしい・・・・。
ファイル名で中身がわかるようにしていたらモジュール名を使っていました。
本当に初心者的なミスですいません。
0300デフォルトの名無しさん
2008/12/09(火) 03:38:05そのためのスレだよ
>>298
ナイスエスパー
きみにはエスパー初段を与える
0301デフォルトの名無しさん
2008/12/09(火) 03:43:02>>299をフォローする>>300にも和んでしまった
0302298
2008/12/09(火) 03:50:28っていうエントリを見たばっかりだったもんで。あと
./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
^^^^^^^^^^^
ここ。
わかりやすいファイル名にしたいという趣旨は理解できる。
例えばtry_とかいうプレフィクスがいいかも。
test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。
0303デフォルトの名無しさん
2008/12/09(火) 04:01:370304デフォルトの名無しさん
2008/12/09(火) 07:00:38前スレでも同じ質問あったしな
0305デフォルトの名無しさん
2008/12/09(火) 08:38:19日本語でおk
0306デフォルトの名無しさん
2008/12/09(火) 10:25:21日本語でおkって言ってみたかっただけだろ。
0307デフォルトの名無しさん
2008/12/09(火) 11:09:260308デフォルトの名無しさん
2008/12/09(火) 13:33:21一般的
0309デフォルトの名無しさん
2008/12/09(火) 13:37:28STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり
0310デフォルトの名無しさん
2008/12/09(火) 13:48:17zshなんてゴミもう捨てたい
0311デフォルトの名無しさん
2008/12/09(火) 14:04:560312デフォルトの名無しさん
2008/12/09(火) 14:11:460313デフォルトの名無しさん
2008/12/09(火) 14:38:31全部Rubyスクリプト内に入れろ
ディレクトリパスとかも直書きだ
不安ならスクリプト内1行目くらいでDir.cdしろ
0314デフォルトの名無しさん
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
0315デフォルトの名無しさん
2008/12/09(火) 16:29:34一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new
して、それだと再現しないわけ?
0316デフォルトの名無しさん
2008/12/09(火) 16:37:25REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、
エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。
特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。
初心者なので食わすプログラムにヘマてる可能性もありますけど。
0317デフォルトの名無しさん
2008/12/09(火) 16:37:52>>315も言ってるけど一度ファイルに落としてみて
それでも再現するなら、そのxmlをどっかにうpしてほしい。
ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。
0318デフォルトの名無しさん
2008/12/09(火) 16:47:56> 特定のページでもなくて
というのは、Document.new の前に p pegeno を入れてみると、
毎回結果が違う、ということ?
0319デフォルトの名無しさん
2008/12/09(火) 17:16:21その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。
0320デフォルトの名無しさん
2008/12/09(火) 17:35:53リファレンスちゃんと読め
0321デフォルトの名無しさん
2008/12/09(火) 17:38:27doc = REXML::Document.new file
end
これだけだが
0322デフォルトの名無しさん
2008/12/09(火) 17:42:06それともeclipse?
0323デフォルトの名無しさん
2008/12/09(火) 17:43:55他人のことなんか気にするな
0324デフォルトの名無しさん
2008/12/09(火) 18:20:43まず、バグエラー吐いたファイルを
>>321 のプログラムで読み込ませて見ましたが、普通に食って
Complete(0)
って正常終了表示されました。
次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ)
もして見ましたが、やはり
Complete(0)
っと正常終了。
こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。
0325デフォルトの名無しさん
2008/12/09(火) 18:25:44まず、バグエラー吐いたページを保存したファイルを
0326デフォルトの名無しさん
2008/12/09(火) 18:40:57>>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。
すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。
何が原因なんでしょうか。
0327デフォルトの名無しさん
2008/12/09(火) 19:11:11・ファイルに落とすだけならエラーが出ない
・ファイルから読んでREXMLに放り込むだけならエラーが出ない
なら、二回ruby起動して別々に処理すればいいんじゃない?
0328デフォルトの名無しさん
2008/12/09(火) 22:39:42色々と試した結果、Rubyを使おうと思っています。
それで、特定のディレクトリのファイルを、
任意のディレクトリにサブディレクトリごとコピーし、
その中のファイルの内容を正規表現で置換し、
その上でファイル名も置換したいのです。
ディレクトリは数十、ファイルは数百くらいです。
こういう処理をショートカット一発でやりたいのですが可能でしょうか?
ちなみにWindowsXPです。
また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。
0329デフォルトの名無しさん
2008/12/09(火) 22:57:21「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。
0330デフォルトの名無しさん
2008/12/09(火) 23:58:26せっかく再現コードを載せてくれたから試そうとおもったけど、
やっぱりこれじゃわかんないや。
できれば ttp://gist.github.com/ とかにコードを載っけてくれない?
あと pegeno は page_no とかにしたほうがいいよ
pegeはカッコワルイ
0331デフォルトの名無しさん
2008/12/10(水) 00:54:41というものはありますか?
数え上げるのがどういう技術なのかわからないので検索すらできませんでした
0332デフォルトの名無しさん
2008/12/10(水) 00:57:490333デフォルトの名無しさん
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)
エラーを吐くですけど。改行を別の文字に置き換えるのは問題なくできたんですが。
0334デフォルトの名無しさん
2008/12/10(水) 01:14:19`gsub' called for #<Array:0x2bb23b0>
^^^^^^^^^^^^^^^^^^^^^^^^
a1があなたの期待しているようなStringの値ではないのです。
0335デフォルトの名無しさん
2008/12/10(水) 01:17:22Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。
a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから
a1.join.gsub
で一つのStringオブジェクトにするか
a1.map{|v| v.gsub }
で中のStringオブジェクトにひとつづつアクセスしてごらん。
0336デフォルトの名無しさん
2008/12/10(水) 01:20:13レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人
0337デフォルトの名無しさん
2008/12/10(水) 01:26:27>>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")
0338デフォルトの名無しさん
2008/12/10(水) 01:30:34すいません、みなさんありがとうございます。
0339デフォルトの名無しさん
2008/12/10(水) 01:32:50ありがとうございます
Mecabを入れてMecab-rubyも入れました。まずはMecabとHpricotを組み合わせてみようと
require 'rubygems'
require 'open-uri'
require 'kconv'
require 'hpricot'
require 'MeCab'
doc = Hpricot(open("http://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周辺がそろえられなかったのでどのようなことができるのかわかりませんでした。
0340デフォルトの名無しさん
2008/12/10(水) 01:38:03>chasen = content.MeCab::Tagger.new("-Ochasen")
おちつけw
0341デフォルトの名無しさん
2008/12/10(水) 01:49:26すいません
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
となってしまいます。
0342デフォルトの名無しさん
2008/12/10(水) 01:52:40p content
として、contentの値を確かめてみて
0343341
2008/12/10(水) 01:56:190344デフォルトの名無しさん
2008/12/10(水) 01:58:03渡すべきはcontent_textのような。
0345341
2008/12/10(水) 02:01:41"\343\202\242\343\203〜〜〜3\240\343\201\270 \342\226\240"
</a>} "\r\n " </center>} "\n" {comment <!--messageBottom-->} "\n" </div>}
という感じでした。
文字コードの設定なんでしょうか?
0347デフォルトの名無しさん
2008/12/10(水) 02:17:03p content_text の文字化けはたぶん問題ない
puts context_text.class とすれば String になっているはず
puts context_text とすれば文字列が表示されるはず
0348341
2008/12/10(水) 02:41:48ありがとうございます!文字列表示されました。
動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。
皆さんありがとうございます!
0349デフォルトの名無しさん
2008/12/10(水) 02:55:19hpricotより早いちゅう感じらしいが
0350デフォルトの名無しさん
2008/12/10(水) 03:14:23なんせWinだとgemでHpricot入れるのが難儀なもんで。
0351デフォルトの名無しさん
2008/12/10(水) 06:35:380352デフォルトの名無しさん
2008/12/10(水) 06:39:170353デフォルトの名無しさん
2008/12/10(水) 06:45:52難しくなかった人はたまたま最新バージョンに Win バイナリがあった人
最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない
これは gem update のアップグレードが悲惨
0354350
2008/12/10(水) 07:36:46やっぱりプロジェクトが活発でなくなるとHpricotみたいにバイナリを用意してもらえず
難しくなるかなぁ…
自分は今のところgemで一発でした。
0355デフォルトの名無しさん
2008/12/10(水) 17:15:590356デフォルトの名無しさん
2008/12/10(水) 18:29:46やめさせることができますが、同じことを irb のプロンプトから
行うことはできますか。
irb を使ってて、inspect による評価を一時的にやめさせようと
しています。
irb> IRB.conf[:INSPECT_MODE] = false
とかしてみましたけど、かわりませんでした。
0357328
2008/12/10(水) 18:43:11ありがとうございます。安心しました。
あと、数百のファイルをコピーする時、
ファイル名を一つ一つ変更したいのですが、
それも可能でしょうか?
名前を一つ一つ打ち込めばできますが、
ファイルの数が数百もあるので、
正規表現で置換するような形でリネームしたいのです。
「コードが一行で済まないかな」と思っています。
0358デフォルトの名無しさん
2008/12/10(水) 19:02:26IRB.conf[:MAIN_CONTEXT].inspect_mode = false
>>357
どういうファイル名をどのように変えるのかがわからないとなんとも。
あと一行でっていうのは、やればできるんだろうけど
いわゆる玄人御用達だからオススメしない。
0359デフォルトの名無しさん
2008/12/10(水) 19:15:12やってみましたが、かわんないです。
あいかわらず inspect の結果が表示されます。
0360デフォルトの名無しさん
2008/12/10(水) 19:21:59で動くかもしれない。
0361デフォルトの名無しさん
2008/12/10(水) 19:30:59やりたいのは--noechoじゃない?
IRB.conf[:MAIN_CONTEXT].echo = false
0362デフォルトの名無しさん
2008/12/10(水) 21:21:39御返事ありがとうございます。
元ファイル名は大体このような感じです。
hoge_428_20-01.txt
hoge と数字の部分が違っているものが数百ほどあります。
それを別のディレクトリにコピーする時に、
index_428_20-01.tex
というような形に変えたいのです。
先頭と拡張子の部分を置換する格好になります。
置換を正規表現で表現すると次のようになります。
検索 [a-z]+([\d_\-])+\.txt
置換 index\1.tex
このようなリネーム処理を、
ファイル(ディレクトリ)コピー時に同時に行いたいのです。
0363デフォルトの名無しさん
2008/12/10(水) 21:24:33びんごです!
さすが特務エスパー、多謝です
0364デフォルトの名無しさん
2008/12/10(水) 21:27:48だからできるっつの
めんどくさいので、対象ファイルの指定も実際のコピーもRubyでやれ
これらを外部から読み込むように作ろうとすると敷居が微妙に高い
より正確に言うと変なものが混じったときのエラー処理がめんどい
0365デフォルトの名無しさん
2008/12/11(木) 09:33:52これを参考にしてみて。
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
役立たずなレス
初心者の相手ができないならくんなよ
0366デフォルトの名無しさん
2008/12/11(木) 15:31:12a = ["hage","hoge","hage"]
a.each{|elem|
return true if elem="hoge"
}
return false
end
上記のようなコードを書くと、funcの返り値が[false,true,false]になってしまうのですが、
trueひとつにしたい場合はどのようにしたらよいでしょうか
0367デフォルトの名無しさん
2008/12/11(木) 15:36:25ごめんなさい、これ勘違いだったので見なかったことに
0368デフォルトの名無しさん
2008/12/11(木) 15:37:110369デフォルトの名無しさん
2008/12/11(木) 15:50:06他の言語の人間だ
0370デフォルトの名無しさん
2008/12/11(木) 16:19:310371デフォルトの名無しさん
2008/12/11(木) 16:23:39タグ名もバラバラです。
例
<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>
タグごと取り出す方法は分かったのですが。
0372デフォルトの名無しさん
2008/12/11(木) 16:28:04rename_rule=[..., ...]
def mkdistnme file
x.sub *rename_rule
end
def movefile from, to
...
end
filenames.map{|x| [x, mkdistnme x]}.each{|ft| movefile *ft}
0373デフォルトの名無しさん
2008/12/11(木) 16:41:37hpricotとかでパースするのをオススメしたいけど
慣れるまでが難しいかも知れない。
ネスト構造無視でいいなら
str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
ary = []
str.gsub(/<.+?>(.+?)<\/.+?>/){ary << $1}
gsub使うのに違和感あるから、もっといい方法があるかも?
0374デフォルトの名無しさん
2008/12/11(木) 17:02:02deleteの動作(主に返り値)に注意
str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
arr = str.split(/<.+?>/)
arr.delete('')
puts arr
殿様カエル
しり上がり
自転車
HTMLとしてパースするのが真っ当
0375デフォルトの名無しさん
2008/12/11(木) 17:09:31そういえばなんでArrayの一部メソッドは破壊的な操作をするのに
!がついてないんだろう。perl由来の名残のような気もするけど
ary = [].push data
[].push! data
と書きそうになることがよくある。
0376デフォルトの名無しさん
2008/12/11(木) 17:34:18b = [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
という順で出力されるようなイテレータの書き方というか呼び方あったら教えてください。
自分でインデックス変数も合わせて用意すればいいんでしょうが
もう少し簡潔なのがあれば嬉しいです。
0377デフォルトの名無しさん
2008/12/11(木) 17:44:16それはプログラム構造そのものが間違っている
絶対にあとで破綻するから、いまのうちに書き直せ
で、その時間がないという場合は、配列をキューとみなして使う
a.shift
b.shift
puts "A"
a.shift
puts "B"
b.shift
a.shift
puts "C"
b.shift
0378デフォルトの名無しさん
2008/12/11(木) 17:47:211.8ならGenerator、1.9ならEnumeratorがそんな感じだけど
推測するにEnumerable#zipで十分なんじゃないかな
[1,2,3].zip([4,5,6], ["A","B","C"]) {|ary| puts ary }
0379デフォルトの名無しさん
2008/12/11(木) 17:47:42継続とかcall/ccとかコルーチンとかだっけ。
require 'generator'
g = Generator.new([1,2,3])
g.next
0380デフォルトの名無しさん
2008/12/11(木) 17:50:280381デフォルトの名無しさん
2008/12/11(木) 18:02:39!は「破壊的」という意味ではない。
!の意味は、それが付かない同名メソッドと比較して、注意すべき挙動の違いがある、という意味。
0382デフォルトの名無しさん
2008/12/11(木) 18:17:24二種類提供する場合のみってことか。サンクス。
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のように破壊的なものはあります。
0383デフォルトの名無しさん
2008/12/11(木) 18:52:51ありがとうございます。
Rubyは初心者ですが、頑張って使いこなせるようになりたいです。
0384デフォルトの名無しさん
2008/12/11(木) 19:45:42正規表現まちがってる。
>from = /[a-z]+(¥d_¥-])+¥.txt$/
from = /[a-z]+([¥d_¥-]+)¥.txt$/
あるいは
from = /¥w+([-_¥d]+)¥.txt$/
とか。[a-z]+ はたぶん ¥w+ で済むんじゃないか。
>>372
十分 Ruby らしいと思うけどね。負け惜しみだと思うよ、>>368-370は。
0385デフォルトの名無しさん
2008/12/11(木) 19:59:40Rateというクラスをインスタンスにして配列にしたいのですが、
@rates = Array.new(Rate.new)
と書くと、
can't convert Rate into Integer
というエラーメッセージが帰ってきて配列に出来ません。
どのようにすれば、インスタンス化したクラスを配列に出来るのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています