[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/16 09:04 / Filesize : 244 KB / Number-of Response : 847
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 23



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

303 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 04:01:37 ]
シェルスクリプトでRuby回してパイプして出力って一般的?

304 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 07:00:38 ]
>>302
前スレでも同じ質問あったしな

305 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 08:38:19 ]
>>303
日本語でおk


306 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 10:25:21 ]
>>35
日本語でおkって言ってみたかっただけだろ。

307 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 11:09:26 ]
おーっと>>306くんロングパスだーッ

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







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef