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


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

Ruby 初心者スレッド Part 17



1 名前:デフォルトの名無しさん [2008/01/16(水) 17:41:27 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2-7あたりを見てください。Ruby on Railsの質問はWebProg板の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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

730 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:10:36 ]
susie/susie

731 名前:デフォルトの名無しさん [2008/02/09(土) 10:21:37 ]
exec() や system() メソッドで、
コマンド実行後に独自の入力プロンプト(入力待ち)状態になるコマンド(ftp, sqlplus 等)を実行したあとに、
さらに、そこへ入力を続けるようなことはどうすれば出来るでしょうか。
以前、どこかのサイトでその方法を見かけて、使ったことがあったのですが、
そのコードが手元に残っていなく、サイトを探してもみあたらなかったため、
質問させて頂きました。
よろしくお願いいたします。


732 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 11:00:53 ]
>>731
標準で付いてるexpect.rbが使えるケースかも?


733 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:16:41 ]
POPFileというベイジアンフィルターソフトの設定画面が、ローカルにたてたhttp鯖に接続して行う形になっています。
スパムを誤認したメールがたまりまくって手動では無理なため、一括で、教育しなおしたいのですが、
httpのPOSTを簡単に扱えるライブラリはないでしょうか?

hpricot的にお手軽にPOSTしたいのですが・・・

734 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:25:44 ]
net/http のどのへんがダメなのか教えてくれると代替案があるかも

735 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:29:23 ]
自己解決した!
WWW::Mechanize というのを発見しました。

お騒がせしました。ありがとうございました。

> net/http
んーなんていうか、httpを意識しないといけない、低レイヤーっぽい感じがします。
hpricot使ったら他に移れないくらい便利だったので、
似たような高レベルなラッパーがないかな、と。

736 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:32:55 ]
require 'rubygems' しなければならないのがどうにもなあ
いや、贅沢なこと言ってる自覚はあるが

>>735
WWW::Mechanizeが利用できる環境なのならそれ使うといいぞ

737 名前:735 mailto:sage [2008/02/09(土) 19:00:00 ]
環境変数RUBYOPT を -rubygems にしておくとgem関連は楽っすよ

738 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:45 ]
>>737は問題を理解してないと思った



739 名前:735 mailto:sage [2008/02/09(土) 21:18:13 ]
あ、ええと、レンサバとかRubyGemsをインスコできない環境とかの話かな?
それなら失礼しますた

740 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:48:52 ]
本家のヘルプ以外のライブラリなどのドキュメントを見ようと、
コマンドラインのドキュメントヘルプを試したのですが、いまいちどれがどうなのかわかりません。

ri:標準。英語ドキュメント。サンプルソースなどもしっかり
refe:gem install refeで入る。日本語ドキュメント。全然少ない。メソッド名の部分一致検索ができる。
rdoc:標準。エラーでて動かず

riは、詳細が載っていてわかりやすいのですが、
検索しずらい・・・
refeみたいに、部分一致だったらいいのに

741 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:18:25 ]
gemしかないならともかく、tar玉あるんだから
$HOMEでもどこでもすきなようにインストールすればいいじゃん。


742 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:38:10 ]
>>740
> rdoc:標準。エラーでて動かず
rdocはriのデータを作るコマンド。

743 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:51:39 ]
>>724
なにそのめちゃくちゃ端折った説明

現状は「英語でいいならri、日本語がいいならReFe」という住み分けになっとる
ReFeの内容がヘナチョコなのは日本語マニュアルがヘナチョコだからだな

むしろ俺はRDocとかRDとかのマニュアル用書式がわからん
何のときに == で書くのかとかさっぱりだ

744 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:57:07 ]
あれだ、もうちょっとMatzがユーザ愛を持って、マニュアルに全身全霊を
傾ければ、Rubyはもっと愛されると思う。願望だけど。

「そんなの面白くない」とか「Matzは開発を優先すべきで、他の人が
やったほうがいい」という反論は重々承知だが。

745 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:00:05 ]
優秀な言語開発者が優秀な初心者向けマニュアルを記述できるとは限らないのは
例の分厚くて黄色くて背が硬い本で痛いほどわかっただろうに

746 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:02:37 ]
>>745
いやでもな、とてつもなく優れたオープンソース開発者が、とてつもなく
優秀なドキュメントを提供する人間である例が目の前にあるとさ。
すごい!と思ってしまうのよね。Vimの開発者のことだけど。

747 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:03:35 ]
日本語マニュアルがイマイチなのの原因は何なのよ

今のRubyユーザー数ならWikiシステムあたりを使って一斉に取り掛かれば
1年くらいで今の倍くらいのボリュームにならんかね

748 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:05:30 ]
>>747
RDだかRDocだかで記述しないと取り込めないからRDだかRDocだかで書いてね、というのがかなり壁
PukiWiki互換で書いていいよと言われたら一気に進みそうな気がする



749 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:09:04 ]
まぁMatzはEmacs信者で、Bramのことなんかよく知らないだろうけど。

750 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:24:35 ]
マニュアル内容の改定に関しては計画はあるんだし参加しようよ
doc.loveruby.net/

751 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 02:39:04 ]
例のデイトレ男に一億くらい恵んでもらってフルタイムのドキュメント書きを雇えばいいんだよ

752 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 02:57:58 ]
なんで、ここで B・N・Fこと小手っちゃんがww

753 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 04:51:26 ]
いやもうmatzは開発しなくて良いよ。
MLのやり取り見てると、正直もう1.8+αで良いと思うし。

754 名前:デフォルトの名無しさん [2008/02/10(日) 05:15:38 ]
>>741-743
ありがとう

マニュアル用のコマンドとして使えるのは ri と refe なのね。

gemsに fxri っつーri GUIフロントエンドがあったから入れたら、まだ使いものにならなかった orz

・起動が遅い
・riのエントリーの読み込みに20分近くかかる(全部よんでると20000エントリくらいになる)
・全部読みこまないと、検索できないw
・検索中に、カラムをクリックすると落ちたwwww
・読み込んだ データ をキャッシュしないので、次回起動時もまた20分かか(ry

読み込んだ後は、リアルタイムに部分一致検索できるし、
irbが立ち上がっててすぐ試せるので、すごく理想的!
いいのにもったいない!!



そして今気づいたのですが、rubyのdocディレクトリに Programming Ruby のHTMLヘルプがついているんですね。
英語だけど、サンプルコードはあるし、入門にはよいですね。

755 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:15:30 ]
ドキュメントは文句だけいって手を動かさない人が多いから進まない

756 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:33:43 ]
>>755
>>750読め

757 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:40:12 ]
オフィシャルにする気マンマンなとこが敷居高いのは仕方あんめえ
変なのが混じりにくいわけでむしろそれ自体は頼もしいとも思うぞ

この調子だといつ完成するのかわからんのが難だが

758 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:53:10 ]
19株売れよwwww



759 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:08:04 ]
>>743
自作のクラスのマニュアルとか作れたらRRSEで楽だろうなと思うんだけどね
メソッドにカーソルが当たったらEmacs下部のミニバッファに1行マニュアル表示

760 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:36:18 ]
特に意味のないサンプルコードなんだけど、
require "Kconv"
puts "隕".toutf8.tosjis

とかするとなんも表示されなかったりするんだけどなんでだ?

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]に標準添付のヤツ

761 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:23:41 ]
>>760
puts "隕".toutf8

の時点で空文字列が返っているのなら
kconv が文字コードの判定に失敗してる。


762 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:32:17 ]
require "Kconv"
require 'nkf'

p "隕".toutf8
p "隕".kconv(Kconv::UTF8,Kconv::SJIS)
p NKF.nkf('-Sw',"隕")


# 結果
"\356\242\246" # 誤り
"\351\232\225" # 正しい
"\351\232\225" # 正しい


763 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:44:27 ]
漢字一文字なんて、どうやってエンコーディングを判別するというのだ(w

764 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:40:14 ]
Rubyの正規表現で前方不一致(否定後読み?)を指定するにはどう書けばよいでしょうか?
秀丸やEmEditorにおける(?<!pattern)です。
具体的にしたいことは、"B"の前に"A"が来ないときだけ
"A"の前に"_"を加えるという処理を行いたいのです。
CB #=> C_B
AB #=> AB

765 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:54:13 ]
1.8:
string.gsub(/(\A|[^A])B/, '\1_B')

1.9:
string.gsub(/(?<!A)B/, '_B')



766 名前:764 mailto:sage [2008/02/10(日) 23:54:36 ]
訂正
× "A"の前に"_"を
○ "B"の前に"_"を

767 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:03:08 ]
>>763


あるいは



768 名前:764 mailto:sage [2008/02/11(月) 00:03:10 ]
>>765
すみません。間違いに気づいて訂正を書いている間にレスをいただいたようです。
ありがとうございました。
1.9では実装されているのですね。



769 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:02:35 ]
>>762
把握した

>>763
いや、"隕"が入ってるときにおかしくなるなぁつー話だったさサンプル悪かったごめん


770 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:15:07 ]
シフトJISの半角カタカナ偶数個かEUCか、は同じバイト列だったりするから、
エンコーディングは可能な限り明示的にすべきと思うけどね。

771 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 09:27:46 ]
toutf8とかtoeucとかtosjisみたいなのは、本当は「selfを○○に変換する」という動作じゃないんだよな
「selfのエンコーディングが△△だと推測した上で○○に変換する」という動作をしてる

だから、△△であろうという部分の推測がコケると変な文字列になる
元の文字列のエンコーディングは指定しておくべき
10文字くらい余分に書かないといけないが、そのほうが動作も確実に速い

772 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:54:23 ]
>>759
検索できるマニュアルって自分で追加して作れるの?

773 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:12:22 ]
無理なんじゃない?
いや、やってやれなくはなさそうだけど

774 名前:デフォルトの名無しさん [2008/02/11(月) 21:27:24 ]
>>771
テキストエディタでも、全角文字少ないと誤認するのと一緒だよなあ

775 名前:655 mailto:sage [2008/02/11(月) 22:46:06 ]
>>719
Amrita使ってる人って少ないのかな(´・ω・`)
>>723
なるほど、そう書くんですね!
…ということは tr の属性値を項目ごとに変えるのはできないわけですよね、、
amrita-altered を試してみることにします

776 名前:デフォルトの名無しさん [2008/02/12(火) 00:47:19 ]
常にUTF8として ENV['PATH_INFO']を受け取りたいのですが
うまい方法はないでしょうか?

下のコードで大体はうまくいくのですが
例にあげてるように短めのカタカナは判別、変換に失敗してしまいます

$KCODE="UTF8"
require "cgi"
require 'nkf'
class String
def to_utf8
NKF::UTF8 != NKF::guess(self) ? NKF::nkf("-w", self) : self
end
end
print "Content-type:text/html;charset=utf-8\n\n"
print ENV['PATH_INFO'].to_utf8

#アテレコ NG
#アテレコテ OK
#アテレコア NG
#アレコテ OK
#テレアコ NG


777 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:52:23 ]
% time python -c 'range(0,10000000).sort'
0.769u 1.022s 0:01.79 99.4% 0+0k 0+0io 0pf+0w
% time ruby -e '(0...10000000).sort'
3.170u 0.259s 0:03.42 100.0% 0+0k 0+0io 0pf+0w

778 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:13:47 ]
>>776
「UTF8以外で送ってきたら頃す」とCGIを使うページのトップに朱書きする



779 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:31:27 ]
>>777
そのコード違うぞ
ボトルネックはこれだ

$ time ruby -e '(0...1000000).to_a'

real 0m2.535s
user 0m2.040s
sys 0m0.490s

Range#to_aは内部的には以下と似たようなことをしてて、
数値が大きくなるとこれが非常に遅い

arr = Array.new
range.each do |i|
arr.push(i)
end
return arr


780 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:44:25 ]
>>778が最善策

「9 27 45 81」は3の倍数でしょうか9の倍数でしょうか? という問いに近い
これは「6」や「3」や「321」が含まれない限り同定できない

781 名前:776 mailto:sage [2008/02/12(火) 02:01:17 ]
>>778>>780
無理なもんなんですか…。
wikiとかで似たような処理をしてるかと思ってたんですが
基本的に違う処理なんですね。

>>778の方法だと法律上ややこちらが不利な気がするので
guessで判断できないときは別の処理にまわすことにします



782 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:08:50 ]
>>781
Webブラウザ経由の場合はUserAgentを見るという手も…
UTF-8なページからPOSTさせるとか

783 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:16:44 ]
Ruby/SDLでWindows向けゲーム作ろうと思うんですが
Windows標準フォントを引っ張るのってどうやればいいでしょう?
例えばTTFフォント指定で"MS ゴシック"と指定すると、
どのコンピュータでも一意にMSゴシックを引っ張るという事です


784 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:27:26 ]
ダミーで既知な文字列をhideen-inputなフィールドに埋め込んでおいて、
そいつがどういうバイナリになってるかを調べる手があったはず。

785 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:37:26 ]
>>784
おーちょっと感動した
覚えとこ

>>783
全く使ったこともなければ実行環境もないが
> font = SDL::TTF.open('sample.tff', 24)
という表記方法から考えて、どうしかして%WINDIR%\Fonts\msgothic.ttcにアクセスすればいいんじゃね

とここまで書いてTTCじゃダメだろと思った
TTCはTTFのカタマリだけど、TTFしか読めませんというやつはTTCは普通読めない
Ruby/SDLには「いくつか埋め込み用フォントがあるようだけど、それでは用足りない?

786 名前:デフォルトの名無しさん [2008/02/12(火) 04:26:23 ]
Miyakoが、MSゴシックとかメイリオに対応してた
Miyakoのソースでも見たらどうかな?

787 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:37:53 ]
>>783
ttp://www.kmc.gr.jp/~ohai/fontlist_rb.html

ちなみにTTCは、Ruby/SDLのリファレンスでは読めることになっているが
俺の手元で試した限りでは成功しなかった
Miyakoではどうやってるんだろう……

788 名前:デフォルトの名無しさん [2008/02/12(火) 16:28:42 ]
コード生成機能を持たないフレームワークプリーズ



789 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:51:40 ]
Webサーバ上の巨大ファイルをダウンロードしたいんですが、
ダウンロード状況を「30%」など表示するにはどうしたらいいですか?
TCPSocket#readで数バイトずつチマチマ取得するしかないでしょうか?

790 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:00:13 ]
数バイト単位はアホすぎます

791 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:04:00 ]
#readの引数に合わせただけです

792 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:05:13 ]
>>789
ttp://0xcc.net/ruby-progressbar/

あとはopen-uriでopenするときに
:content_length_proc で 最初のサイズ設定
:progress_proc で進捗伝達
をさせるようにすればいい

793 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:17:14 ]
require 'open-uri'

uri = URI.parse('gems.rubyforge.org/yaml')
total = 0
count = (0..100).to_a
open(uri,
:content_length_proc => lambda {|n| total = n; puts "#{n}バイトいきます"},
:progress_proc => lambda {|n|
pc = (n.to_f/total*100).to_i
if pc == count.first then
puts "#{pc}%終了"
count.shift
end
}).read

# =====================================
$ ruby ./progress.rb
16047764バイトいきます
0%終了
1%終了
2%終了
3%終了




794 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:48:25 ]
メソッドの引数にハッシュを取りたいです。
とり得るキーが多めにあった場合とか、うまく処理する方法ってありますか?
キーは1個の場合も4個の場合もあり、複数のキーが互いに必須なこともあります。

795 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:53:08 ]
>>792-793
なるほどこりゃ便利ですね
open-uriのライブラリを掘り下げてみましたら
なるほどキモになってる部分は Net::HTTPResponse#read_body {|str| .... } ですね
ありがとうございました

796 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:55:43 ]
うまく処理する方法とは?
まず、まずい処理がどんなものか説明してもらおうか。



797 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:00:04 ]
>>794
素直にやるとこうだと思うぞ

def hoge(h)
case h
when h.has_key?(:param1) ...
when h.has_key?(:param2) && h.has_key?(:param3) ...
else raise "引数が不正です"
end
end

:param1と:param2は背反でないと処理上困るのになぜか同時に指定されてる、
とかいうエラーへの対処は無視しろめんどくさくなるから
「同時に指定したら死刑」とかいう立て札でも立てとけ

798 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:01:42 ]
>>794
質問の意味が良く分からないが・・・

>キーは1個の場合も4個の場合もあり、
case hash.size
when 0
when 1
・・・

>複数のキーが互いに必須なこともあります。
if hash.key?(foo) && hash.key?(bar)

こんな感じじゃないか?



799 名前:デフォルトの名無しさん [2008/02/12(火) 21:35:04 ]
>>792-793
open-uriってお手軽なだけかと思ったら、意外に融通利いてびっくりだ

800 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:34 ]
もう見てないかもしれないが
>>310>>316
今北なので、亀レスで申し訳ない

nowrite(true)、verbose(true) メソッドを使えばそれ以降
:noop=>true、:verbose=>true がデフォルトで設定される…はずなのだが
Rakeのバグでshとruby以外のメソッドに適用されない

つづく

801 名前:800 mailto:sage [2008/02/12(火) 22:15:10 ]
修正するには rake.rb に以下のパッチを当てればおk
Index: rake.rb
===================================================================
--- rake.rb (revision 639)
+++ rake.rb (working copy)
@@ -871,8 +871,8 @@
module FileUtils
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])

- OPT_TABLE['sh'] = %w(noop verbose)
- OPT_TABLE['ruby'] = %w(noop verbose)
+ OPT_TABLE['sh'] = [:noop, :verbose]
+ OPT_TABLE['ruby'] = [:noop, :verbose]

# Run the system command +cmd+. If multiple arguments are given the command
# is not run with the shell (same semantics as Kernel::exec and
@@ -970,10 +970,10 @@

FileUtils::OPT_TABLE.each do |name, opts|
default_options = []
- if opts.include?('verbose')
+ if opts.include?(:verbose)
default_options << ':verbose => RakeFileUtils.verbose_flag'
end
- if opts.include?('noop')
+ if opts.include?(:noop)
default_options << ':noop => RakeFileUtils.nowrite_flag'
end



802 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:28:06 ]
既出でしたらすみません。トップレベルのインスタンス変数、selfについて質
問です。

クラス・モジュール定義内ではインスタンスメソッドの外に定義したインスタ
ンス変数はクラスオブジェクト(Klass)のインスタンス変数になり、インスタン
スメソッドとはselfが異なるのでアクセスできません。

class Klass
@a = 1 <--
def foo \
@a <-----+-- 別物(selfが異なる)
end
end
Klass.new.foo => nil

しかし、トップレベルで定義したインスタンス変数はトップレベルで定義した
メソッドからselfが同一なのでアクセスすることができます。

@a = 1 <--
def foo \
@a <-----+-- 同一(selfが一緒)
end
foo => 1

なぜトップレベルではメソッド定義内のselfとメソッド定義の外のselfが同一
になるのでしょうか。
rubyインタプリタが起動時に

Object.new.instance_eval { *ここがトップレベル* }

のようにしてトップレベルを作っていると解釈すればよいのでしょうか。


803 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:39:00 ]
$ cat top.rb
p self
def hoge
p self
end
hoge
p self.class

$ ruby top.rb
main
main
Object


804 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:07:32 ]
>>803さん、ありがとうございます。

トップレベルのselfはObjectのインスタンスで評価するとmainというものが返っ
てくるというのは理解できるのですが、トップレベルがどのようにして作られ
てselfが設定されているのかがわかりません。
あと、なぜトップレベルのselfはmainという表記で#<Object:0x294dc>みたいな
表記にならないのでしょうか。
そういう言語仕様なのでしょうか...


805 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:24:52 ]
>>804
トップレベルをオブジェクト指向として悩むのはあまりよくないぞ
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/8965

まあ、Module#privateされたでっかいObjectクラスの中身だと考えられなくもないけど

806 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:39:52 ]
"main"と返るのはそう定義されてるから。(object.c)
RubyのCソースは一部の例外を別にすれば見やすいから追いかけてみるとよい。


807 名前:804 mailto:sage [2008/02/12(火) 23:58:30 ]
>>805さん、>>806さんありがとうごぜいます。
>>805さん
bladeのスレッド読んでみました。確かにEiffelやJavaよりもいきなり制御を書
けてしまうrubyのほうがありがたい気がします。
そういえば質問する前にbladeでnamazu検索してみたのですが、結果のリストが
表示されませんでした。壊れているんでしょうか?
>>806さん
そうですね。rb_internあたりで萎えてしまうのですが。頑張って読んでみます。


808 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:01:03 ]
あ、それ俺も気づいた。bladeの検索は死んでる。
今じゃgoogle site:使ってるなあ



809 名前:804 mailto:sage [2008/02/13(水) 00:24:48 ]
そうかgoogle site:を使えばよかったのかー。頭悪いな > オレ
>>806さん、ソース読んでみました。
main_to_s
rb_define_singleton_method(ruby_top_self, "to_s", main_to_s, 0);
拍子抜けしました。Init_Objectあたりをもっと深く読んでみようと思います。
ありがとうございました。


810 名前:783 mailto:sage [2008/02/13(水) 02:49:21 ]
レスくれた方有難うございました。
確かにttcは読み込めなかったので
Miyako入れる方向で探っていく事にします
それにしてもruby/SDLの文字表示がこんなに弱いとは…

811 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 04:33:24 ]
>>779
釣られてるよ。
>>777のpythonのコードは、sortに()が付いてないから実際にはソートしてない。

812 名前:デフォルトの名無しさん [2008/02/13(水) 07:53:37 ]
$ irb
irb(main):001:0> l=[100,101,102,103,104,105,106,107,108,109]
=> [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
irb(main):002:0> l.each_with_index do |item,idx|
irb(main):003:1* puts "hit #{item}"
irb(main):004:1> l.delete_at idx if 0==item%2
irb(main):005:1> end
hit 100
hit 102
hit 104
hit 106
hit 108
=> [101, 103, 105, 107, 109]
irb(main):006:0>
意図したとおり奇数だけ残せたのですがhitの表示がなぜ偶数だけになっているか分かりません
delete_atするより前でputs "hit #{item}"してるので全要素がputsされると思ったのですが。。。


813 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:07:34 ]
消す度にずれてるから

p l
とか
puts "hit #{item} at #{idx}"
にして見れば分かる

delete_ifを使えばいいよ

814 名前:812 mailto:sage [2008/02/13(水) 08:28:52 ]
理解できました ありがとうございます
delete_if使ってみます

815 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:05:53 ]
>>811
python -c 'range(0,10000000).sort'
real 0.0859320 user 0.0468750 sys 0.0312500

python -c 'range(0,10000000).sort()'
real 0.0771435 user 0.0312500 sys 0.0468750

>>779
ruby -e '(0...10000000).sort'
real 2.1707595 user 1.6875000 sys 0.1406250

ruby -e '(0...1000000).to_a
real 0.3525165 user 0.2500000 sys0.0937500

816 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:10:38 ]
桁が違うとか紛らわしい
ruby -e '(0...10000000).to_a
real 1.6034130 user 1.4531250 sys 0.1406250

817 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:14:36 ]
10000000 を 10_000_000 とか 1000_0000 とか書けることは意外と知られてないし使われてないな

irb> p 10_000_000
10000000


818 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:41:43 ]
>>810
でもMiyakoでは特に変なことしてないみたいだぞ?
api/font.rb を「TTF」で検索してみ



819 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:09:52 ]
Pythonのマージソートは部分整列を利用してほげほげとかクックブックに書いてあったから
range(0,10000000).sort() のソートにほとんど時間がかからないはず。
(参考:svn.python.org/view/*checkout*/python/trunk/Objects/listsort.txt)
Rubyはどうなのよ

820 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:29:39 ]
マージソートなのか。
rubyはクイックソートだから、整列済みのものには不利だな。

821 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:34:42 ]
>>820
それもあるけど、1.9だとシステム提供のqsortでなく割と高速なqsort実装を使っているので、その例だとPythonとほぼ互角の速度になる。

822 名前:デフォルトの名無しさん [2008/02/13(水) 18:19:53 ]
"ID;本文"という形式のcsvファイルを読み込み、
本文だけを文節単位でわかち書き(半角スペースを挿入する)して
返すスクリプトを書きたいと思っています。
そのため、RubyからCaboChaにテキストを渡して処理しようと
CaboCha0.53をインストールしたのですが、
肝心のCaboChaの呼び出し方がさっぱりわかりません。

CaboCha公式サイト(chasen.org/~taku/software/cabocha/libcabocha.html
には「詳しくは, ruby/README…をご覧ください.」と書いてあるのですが
そのruby/READMEがCaboChaインストールフォルダ内に見つからず…
どなたか、インストール方法とRubyからの呼び出し方を
教えていただけますでしょうか。

●実行環境
WindowsXP SP2
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
※One-Click Installer - Windows 1.8.6-26 Final Release 使用

CaboCha 0.53(Binary package for MS-Windows)

823 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 19:18:25 ]
>>822
CaboCha というのは全く使ったことがないけど、
そのページから落せるソース cabocha-0.53.tar.gz には
ruby/README は入ってたよ。
中を読むとさらに test.rb を読めとあって、test.rb 内には
コメントとかまったく書いてないんだけど、まあその辺は C ライブラリの
方を見て予想しろってことなんじゃないかと。

あ、Windows での tar.gz の伸長には適当になんかフリーソフトを探してくれ。

824 名前:デフォルトの名無しさん [2008/02/13(水) 20:44:51 ]
Cgi = CGI.new

ip = ENV['REMOTE_ADDR']
host = ''

begin
host = Socket.gethostbyname(ip)[0]
rescue
host = ip
end

Cgi.out{host}

これでちゃんとリモホ名に変換出来る鯖と
出来ない鯖があるんですが、鯖の問題なんですよね?

825 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:52:30 ]
rescueでエラー殺しておいてそういう質問するな

SocketError: host not found
が出るという話ならRubyのバージョンが悪いとかなんとかいうことになってた気がする
エラー時にコマンドラインから外部コマンド使うとなんとかなるかも

826 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:08:44 ]
>>825
すみません…
助言ありがとうございました!

827 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:31:37 ]
require 'cgi'
require 'socket'
cgi = CGI.new
begin
cgi.out{Socket.gethostbyname(ENV['REMOTE_ADDR'])[0]}
rescue
cgi.out{CGI.escapeHTML($!.inspect)}
end

う〜ん、こうやっても特に例外は出てない様です…
変換出来ない鯖のRubyのversionは1.8.5でした…

828 名前:783 mailto:sage [2008/02/14(木) 02:31:38 ]
ruby/SDLの日本語表示の質問した者ですが
IPAフォントというフリーのttfを見付けたので
Miyakoを入れずとも日本語表示は出来ました

ただ、新たな問題としてボールドとイタリックの書体設定が出てきました
見る限りSDLやMiyakoにそういう機能は無いようですし…
そもそもこういう書体設定はどういう理屈でやってるんでしょうか



829 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 02:35:27 ]
>>827
とりあえず何かのファイルにENV全体を書き出してみたら?
CLIENT_IPとかX_FORWARDED_FORとかVIAとかなら取れるかもしれない。


830 名前:828 mailto:sage [2008/02/14(木) 02:41:52 ]
>>828
自己解決しました
思いっきりスタイルの設定部分見落としてたわ…
失礼しました






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

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

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