トップページ⇒tech
1001コメント342KB

Ruby 初心者スレッド Part 30

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2009/08/08(土) 08:21:23
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の 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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0855デフォルトの名無しさん2009/09/11(金) 11:47:59
>>853
できね
文字列としてクラス名を適当に作ってからevalしろ
定数になる書式しか受け取らないevalはあれば楽しいが多分無い
0856デフォルトの名無しさん2009/09/11(金) 11:49:54
>>854の意味なら
new_class_name = 'Baz'
Foo::Bar.const_set(new_class_name, Class.new)
0857デフォルトの名無しさん2009/09/11(金) 15:36:36
ドキュメント表記でFoo::Hogeと書かれている場合のFooとHogeの関係は、

○HogeはFooの内部クラス
○HogeはFooの内部モジュール
○HogeはFooで定義された定数

のいずれかと思っていれば間違いないでしょうか?
ドキュメントを見て自分で調べた限りではこのような使われ方がされているようです。
継承したクラスや、インクルードしたモジュールなどは、Hoge::Fooのような書き方をしていないようなのですが、継承・インクルード用の表記法はあるのでしょうか?
0858デフォルトの名無しさん2009/09/11(金) 15:42:06
意味的にはそれであってる、実装的には三つ目に集約される
というのもクラスもモジュールも、ClassインスタンスやModuleインスタンスが定数に代入されているだけに過ぎないから

継承はC < Object
モジュールにお約束はないと思うけど、リファレンスでは継承と同じように書いてるね
C < Enumerable < Object
08598452009/09/11(金) 15:50:03
>>846
レスどうも。
理解の助けになるようなサンプルがググっても見つかりません。
(手元の本のサンプルはやたら行数が多いし)

適当なサンプルコードってありますか?
08608572009/09/11(金) 15:52:25
>>858
ありがとうございます。すっきりしました。
モジュールのインクルードもHoge::Moduleと書きたくなっちゃうけど違うんですね。
公式HP見たら、ご指摘どおり、Array < Enumerable < Object < Kernelとなってました。
Java厨の自分にはObject < Kernelはとっても違和感がw
0861デフォルトの名無しさん2009/09/11(金) 15:56:46
>>859
x = 1; t = Thread.new(x){ sleep 1; p x }; x += 1; t.join #=> 2
x = 1; t = Thread.new(x){|y| sleep 1; p y }; x += 1; t.join #=> 1
こういう話?
0862デフォルトの名無しさん2009/09/11(金) 15:58:14
一個目まちがえた
x = 1; t = Thread.new{ sleep 1; p x }; x += 1; t.join #=> 2
0863デフォルトの名無しさん2009/09/11(金) 16:00:41
>>860
公式のどこ?その書き方おかしいだろ
モジュールは何個でもincludeできるから一つの流れでObjectまで辿り着けるわけじゃないし
0864デフォルトの名無しさん2009/09/11(金) 16:07:39
>>863
http://doc.okkez.net/static/187/class/Array.html

p Array.ancestors #=> [Array, Enumerable, Object, Kernel]
いくつでもincludeはできるけど、優先順位はきっちり存在する
0865デフォルトの名無しさん2009/09/11(金) 16:16:07
String < Comparable < Enumerable < Object < Kernel
p String.ancestors #=> [String, Enumerable, Comparable, Object, Kernel]

矛盾してるぞ
0866デフォルトの名無しさん2009/09/11(金) 16:22:56
それは知らん、書いたヤツに聞いてくれw
0867デフォルトの名無しさん2009/09/11(金) 16:26:59
Comparable < Enumerableはさすがに意味不明だね。無関係のモジュール同士だし。
あまり階層を意識しないでとりあえずincludeしてるモジュールが分かればいいって程度の表記なんじゃない?
0868デフォルトの名無しさん2009/09/11(金) 17:12:56
ライブラリの「ファイル名の区切り」ってハイフンとアンダースコアとキャメルケースのどれがいい?
既存のHogeというライブラリがあって、それの非公式エクステンションぽい感じなんだけど

require 'hoge-ext'
require 'hoge_ext'
require 'hogeext'
require 'hogeExt'

どれになるのがそれっぽいかな
0869デフォルトの名無しさん2009/09/11(金) 17:18:20
>>868
OpenURIにPOST機能をつけた場合

module OpenURIPost
require 'open-uri-post'

これがフツーだと思う
というか、require名はハイフンになるようにライブラリ作れというお達しがどっかに…
0870デフォルトの名無しさん2009/09/11(金) 17:59:10
>>868
その中ならhogeextかhoge-extかな
個人的にはこっちのほうが良いと思う

require 'hoge/ext'
0871デフォルトの名無しさん2009/09/11(金) 18:07:41
本家でもないのにディレクトリ切るとな

いや、見栄えもいいのはわかるんだが
本家 hoge の下に foo とか bar とかあった場合ちょっと微妙に
0872デフォルトの名無しさん2009/09/11(金) 18:35:19
実装上は、includeはスーパークラスと自クラスの間にダミーのクラスを
挿入してそこに指定モジュールからメソッドを追加する感じ(てきとう)。
別のモジュールのincludeではその結果出来る階層にさらに別のダミー
クラスを挿入するので、内部的にはモジュール(ダミークラス)が線形に
階層を成している。

ドキュメントにそれを意識して反映してるかはシラネ。
0873デフォルトの名無しさん2009/09/11(金) 18:49:21
ext という別途存在して見慣れてるディレクトリ名なのがよくない

require 'hoge/plus' とかそういうのにすれば違和感が
0874デフォルトの名無しさん2009/09/11(金) 18:57:17
Railsのスレが過疎ってるのでこちらで質問させてください。
ruby script/generate scaffold book title:string author:string
これでbooksテーブルを作成するmigrationファイルが出来るのは分かるのですが、
NOT NULL制約やstringの長さの制限などを指定することはできないでしょうか?
generate scaffoldでテーブルを作ると全てのカラムでNULL可、文字列は255文字になってしまいます。

仕方なく、作成されたmigrateファイルを修正することで対応していますが、これは正しいやり方でしょうか?
0875デフォルトの名無しさん2009/09/11(金) 19:15:40
>>874
WebProg板のなら、最終投稿10日だし、別に過疎ってないと思う。

やりかたはそれでOK
全くカラム情報を与えずに作って空のmigrationに一から手で書いても
構わない。

そもそもmodelのgenerator templateの中身は
t.<%= attribute.type %> :<%= attribute.name %>
だし。
08768742009/09/11(金) 19:37:46
>>875
http://pc12.2ch.net/test/read.cgi/tech/1216829388/このスレのことを言いました。
WebProg板の存在は知りませんでした。誘導ありがとうございます。次からはそちらで質問します。

migrationに手を加えるやり方でよかったのですね。railsの精神に反する気がして少し躊躇してました。
ありがとうございました。
0877デフォルトの名無しさん2009/09/11(金) 19:43:18
任意次元の多次元配列を初期化するには、どう書くのがスマート
でしょうか?

たとえば

size = [2, 3, 4]

というサイズ指定配列を渡されたら、

a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}

と等価なことをしたいです。
0878デフォルトの名無しさん2009/09/11(金) 19:50:04
Rubyには多次元配列は存在しない
単なるネストした配列だ

ということで、ネストしてるだけなのでネストしてnewする
a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
0879デフォルトの名無しさん2009/09/11(金) 19:53:46
pdfファイルを読み込み表示させようと思って以下のコードを書いたのですがうまくいきません。

open("010.pdf", "r") do |f|
f.gets
end

pdfファイルを読み込むには何か正しい方法があるのでしょうか。
最初はpdftotextでtextファイルに変換してから読み込もうと思ったのですが、
pdftotextを使う方法が分からなかったので直接読み込む方法を探しています。

環境はwindowsです。よろしくお願いします。
0880デフォルトの名無しさん2009/09/11(金) 19:58:51
PDFファイルをテキストエディタで直接開いてみるとなんかわかるかも
というかそのエディタで開くということと同じことしかしてないわけだが
0881デフォルトの名無しさん2009/09/11(金) 20:01:55
Windows なら open は r ではなく rb だろ
そのへんの説明はあるはずなんだが

とりあえず gets ではどうにもならんと思うんで
素直に read してその pdftotext なりなんなりで解析してもらえ
0882デフォルトの名無しさん2009/09/11(金) 20:04:48
>>878
> a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}

それじゃダメなので質問してるんですが。

size が必ず [2, 3, 4] と指定されるのでしたら

def foo(size)
return Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
end

で OK なんでしょうけど、渡される size は [5, 4, 3, 2] だったり
[2, 3, 4, 5, 6, 7] だったりとサイズも次元も可変なのです。
0883デフォルトの名無しさん2009/09/11(金) 20:09:19
本当にWindowsは糞だな。
Mac OSX最新版のSnow Loepardなら
テキスト、画像、動画、PDF、MS Officeをプラグインなしで統一的に扱えるのに。
0884デフォルトの名無しさん2009/09/11(金) 20:12:26
>>882
Rubyの配列に次元は存在しない
お帰りください
0885デフォルトの名無しさん2009/09/11(金) 20:26:18
rubyのコレクションフレームワークって配列とハッシュしかないの?
0886デフォルトの名無しさん2009/09/11(金) 20:27:16
def make_nested_array(*sizes)
  case sizes.size
  when 0
    []
  when 1
    Array.new(sizes[0], 0)
  else
    Array.new(sizes[0]){
      make_nested_array(*sizes[1..-1])
    }
  end
end
0887デフォルトの名無しさん2009/09/11(金) 20:36:09
>>885
Stack、ListはArrayで間に合うだろう。
Queueは、優先度が付かないならArrayを使え。
このへんは大クラス主義。

標準では、他にSetが付いてくるが、組み込みではないので要require。
Treeは標準にはない。
0888デフォルトの名無しさん2009/09/11(金) 20:37:35
>>883
Rubyで? すごいねー
0889デフォルトの名無しさん2009/09/11(金) 20:54:07
>>886
なるほど。
*size を size に替えてうまく動きました。
ありがとうございました!
0890デフォルトの名無しさん2009/09/11(金) 21:17:37
>>880
テキストエディタで開くと文字化け?してしまいます。

>>881
pdftotext.exeは実行ファイルなのですが、Rubyのスクリプトから使用する方法が分かりません。
何度も申し訳ないのですが、教えて頂けないでしょうか。。
0891デフォルトの名無しさん2009/09/11(金) 21:22:12
`pdftotext hoge.pdf`?
0892デフォルトの名無しさん2009/09/11(金) 21:22:58
>>889
横からだけど
make_nested_array([2, 3, 4])
よりは
make_nested_array(2, 3, 4)
のほうが素直というかRuby的だと思う

ary = [2, 3, 4]
で渡された時のことを考えているんだろうけど
make_nested_array(*ary)
とやれば引数を展開できる

>>890
pdftotext.exeは知らないけど、コンソールでできることなら大抵system関数でできる
コマンドラインを関数に渡せばいい
0893デフォルトの名無しさん2009/09/11(金) 21:53:15
system関数でできました。本当にありがとうございました!
0894デフォルトの名無しさん2009/09/11(金) 22:00:33
rubyでpdfを作るにはどうすればいいですか?
0895デフォルトの名無しさん2009/09/11(金) 22:03:58
>>894
ruby pdfでググると色々出てくるので好きに選べばいいじゃない
0896デフォルトの名無しさん2009/09/12(土) 07:51:58
>>894
ぶっちゃけ、基本ただのテキストファイル。仕様どおりに作ればいい。

適当に一部分だけgzipかけてみたりフォント埋め込んでみたり暗号化してみたり
してる部分もあるが、それは全部付加的なものだし。

現実的には、>>895。RubyならHaruでいいんじゃね?
0897デフォルトの名無しさん2009/09/12(土) 08:33:37
>>879
ハイハイ、マルチポスト、マルチポスト

Rubyでpdfファイルを読み込む方法 -OKWave
http://okwave.jp/qa5281984.html

こっちで、解決したらあっちのも答え書いとけよ
0898デフォルトの名無しさん2009/09/12(土) 09:15:54
RubyでPDFをgrepできたら便利だな
簡単にできるのならやってみようかな
0899デフォルトの名無しさん2009/09/12(土) 09:35:10
PDFを読んでるわけじゃないぞ
PDFをプレーンテキストにする外部プログラムにファイルを渡して
標準入力から受け取って文字列にしてるだけ
0900デフォルトの名無しさん2009/09/12(土) 15:15:55
中括弧 { } を付けても付けなくても同じ結果になるのですが、これらに違いはあるのでしょうか?

def hoge arg
p arg
end

hoge( :a => 1, :b => 2 ) #=> {:a=>1, :b=>2}
hoge( {:a => 1, :b => 2} ) #=> {:a=>1, :b=>2}
0901デフォルトの名無しさん2009/09/12(土) 15:24:48
>>900の場合は同じ意味。

{}はHashを意味している。
メソッド引数の最後のものがHashである場合に限り、{}を省いてよい。
0902デフォルトの名無しさん2009/09/12(土) 15:28:06
>>901
そうなんですか。
�d
0903デフォルトの名無しさん2009/09/12(土) 16:44:49
rubyとpythonはどっちが強いですか?
0904デフォルトの名無しさん2009/09/12(土) 17:03:01
ruby
0905デフォルトの名無しさん2009/09/12(土) 19:24:56
たしかにruby厨はpython厨よりしつこいな
0906デフォルトの名無しさん2009/09/12(土) 21:54:36
>>903
何を以って強さとするかによる
0907デフォルトの名無しさん2009/09/12(土) 22:09:19
実行速度
書きやすさ
読みやすさ
インストールのしやすさ
ライブラリの使い勝手
リファクタリングの効率
配布
どれをとっても(ry
0908デフォルトの名無しさん2009/09/12(土) 22:43:51
議論してもどうせ荒れる方向にしか行かないんだから初心者スレでこうゆうネタ出すの止めて
0909デフォルトの名無しさん2009/09/12(土) 23:27:50
どうせたいていは釣りなんだからボケの腕の見せ所かと
0910デフォルトの名無しさん2009/09/13(日) 00:19:22
rubyスレはこういうときにもボケで返すセンスのある香具師が多いが
pythonスレではまじめにレスするかスルーされるケースが多い
よってruby埼京
0911デフォルトの名無しさん2009/09/13(日) 00:23:54
2chってどこ行ってもごみレスつけるおっさんばっかりになってるな
そんなに寂しいのか彼らは
0912デフォルトの名無しさん2009/09/13(日) 02:08:10
>>910
おまえはボケのセンスがないんだな
0913デフォルトの名無しさん2009/09/13(日) 12:39:10
すいません質問させてください

(@@connections ||= []) << self

上記のコードの
@@がクラス変数, << が配列への要素の追記ということはわかったのですが
||= の記号の意味がうまく調べられませんでした
どなたか教えていただけないでしょうか?
0914デフォルトの名無しさん2009/09/13(日) 12:42:56
@@connections = @@connections || []
0915デフォルトの名無しさん2009/09/13(日) 13:08:12
>>913
||=は左辺がnil、falseでないときは何もしない
もしnil、falseなら右辺を代入する。
0916デフォルトの名無しさん2009/09/13(日) 13:29:01
このページ全部に目を通しておくといいよ
http://doc.okkez.net/static/187/doc/spec=2foperator.html
0917デフォルトの名無しさん2009/09/13(日) 14:10:48
>>913
foo ||= []
は
foo = [] unless foo
とおなじ。
(foo ||= []) << "aaa"
は
foo = [] unless foo
foo << "aaa"
とだいたい同じ。
0918デフォルトの名無しさん2009/09/13(日) 15:18:56
foo = [] unless defined?(foo) じゃないと動作しないだろ、というツッコミは
これはこれで面倒な話でありましてですな
0919デフォルトの名無しさん2009/09/13(日) 15:34:47
まあ、

irb> (p "ok") if foo
NameError: undefined local variable or method `foo' for main :Object
     from (irb):1
     from :0

がエラーで

irb> (foo = "ok") if foo
nil

が OK というのは不条理っちゃ不条理ではある
ちなみに (foo = "ok") if foo のあと、 foo は nil を返す
0920デフォルトの名無しさん2009/09/13(日) 15:42:16
へえ!そんな違いあるのか 初めて知った
どういう基準で分かれてるんだろう?
0921デフォルトの名無しさん2009/09/13(日) 16:11:24
>>920
FAQ にもあるんだが、ローカル変数は、構文解析で代入が見つかるかどうかだけが鍵
実際に(いつ)実行されるかどうかは関係がない

if false
foo = "OK"
end
foo

上記は NameError を起こさないが、以下は foo が NameError を起こす

for e in [1, 2 ,3]
if e == 2 then
foo
else
foo = "OK"
end
end

動作は同一なはずの unless で 代入記述の順番を変えると NameError は起こらない
for 構造はスコープを作らないことに注意

for e in [1, 2 ,3]
unless e == 2 then
foo = "OK"
else
foo
end
end
0922デフォルトの名無しさん2009/09/13(日) 16:15:42
FAQはこちら
ttp://www.ruby-lang.org/ja/man/html/FAQ_CAD1BFF4A1A2C4EABFF4A1A2B0FABFF4.html#a2.2e3.20.a5.ed.a1.bc.a5.ab.a5.eb.ca.d1.bf.f4.a4.cf.a4.a4.a4.c4.bb.b2.be.c8.b2.c4.c7.bd.a4.cb.a4.ca.a4.eb.a4.ce.a4.c7.a4.b7.a4.e7.a4.a6.a4.ab
長い長すぎる

FAQでは昔ながらに「nil で初期化しとけ」と書いてあるが、
こんな繰り返しのスコープを意図的に利用するスクリプトを書くことのほうがヤバい兆候であることがわかってる
素直に他の方法を考えるのがよい
そもそも一般的な each ではスコープが毎回切れるからこれの再現すらできないしな
0923デフォルトの名無しさん2009/09/13(日) 16:16:02
これ、実際改良する気ないのかな。Rubyの実装もいろいろ出てきてるんだし。
気持ち悪くないのかな。それとも、別に実装の都合ではなくてポリシーなのか?
0924デフォルトの名無しさん2009/09/13(日) 16:31:24
もともとそういうポリシー。
ブロックでスコープをわけないようにするという話もあったりするので、
遠い未来の2.0あたりでは>>921の例も動くようになるかも。
0925デフォルトの名無しさん2009/09/13(日) 16:41:10
スタックに積まれるローカル変数は明示的に初期化すべしってのはrubyに限ったことじゃない。
09269132009/09/13(日) 16:46:38
>>914-919
ご丁寧にありがとうございます。
ソース読んでいてここだけわからなくて困っていたのですが助かりました。
0927デフォルトの名無しさん2009/09/13(日) 16:48:29
>>925
if ARGV
 opt1 = ...
end
opt1_runner(opt1) if defined?(opt1)

これが期待通り動作しないということなんだぜ
たかがローカル変数で

opt1 = nil
if ARGV
 opt1 = ...
end
opt1_runner(opt1) if opt1

とか書かなければならないのは流石にバカっぽい
0928デフォルトの名無しさん2009/09/13(日) 17:13:36
バカっぽいか?すごく素直な書き方でいいと思うけど。
0929デフォルトの名無しさん2009/09/13(日) 17:15:13
Rubyのifはスコープを作らないだろ

いわんとすることはわかるが
0930デフォルトの名無しさん2009/09/13(日) 17:18:18
そんな小さな労力のために仕様変更してたらぐちゃぐちゃになるわ。
ローカル変数を初期化不要にしてしまうと、フィールド変数を参照してるつもりでスペルミスしてもエラーにならなくなる。
あらゆる場所で意図しないローカル変数が勝手に生成される可能性があるわけで何とも気持ち悪い。

フィールドはオブジェクトの属性という意味合いから初期値があるのは自然だけど、
ローカル変数はちょっと値を保存しておく場所って意味合いしかないから、ソースコードを簡略化するために初期値を設けるってのも設計上美しくない
0931デフォルトの名無しさん2009/09/13(日) 17:37:53
質問です
下記のように@flagを判別して
@flagがtrueの場合, testのputs "test"が実行され
@flagがnilの場合,testを中断させputsは実行されない
という処理を書きたいのですが可能でしょうか?
flag_ok?でfalseを返してもいいのですが、
test2,test3と他にも最初にフラグをチェックして@flagがnilの場合、処理を中断したいメソッドが複数あるので、シンプルに書く方法を模索してます

@flag = nil

def test
flag_ok?
puts "test"
end

def test2
flag_ok?
puts "test2"
end

def flag_ok?
if @flag
return true
else
return "testの実行を中断させるなにか"
end
end

0932デフォルトの名無しさん2009/09/13(日) 17:45:10
@flag = nil

def test
 return if @flag
 puts "test"
end

def test2
 return if @flag
 puts "test2"
end

これじゃなんかダメなん
0933デフォルトの名無しさん2009/09/13(日) 17:51:15
>>932
条件逆
09349312009/09/13(日) 19:08:11
>>932
ありがとうございます参考に直してみました。
ちょっとエラー時に処理をいれたかったのと
うまいこと1行で書きたかったのですが
すっかり if,unlessのこの書き方を失念してました

@flag = nil

def test
return unless flag_ok?
puts "test"
end


def flag_ok?
if @flag
return true
else
puts "処理"
return false
end
end
0935デフォルトの名無しさん2009/09/13(日) 21:25:21
フィールド変数って何?
0936デフォルトの名無しさん2009/09/13(日) 21:32:13
>>935
@hoge = 1234
の@hogeのこと。

Rubyだとインスタンス変数かな?
フィールド変数はJava用語だったかも?Delphiでも聞いたな。
C++だとメンバ変数だっけか。
0937デフォルトの名無しさん2009/09/13(日) 21:33:51
>>935
Rubyで言うインスタンス変数

逆か、他の言語で言うフィールド変数はRubyではインスタンス変数で扱う
0938デフォルトの名無しさん2009/09/13(日) 22:56:49
Smalltalk流だな、インスタンス変数という呼び名は。
0939デフォルトの名無しさん2009/09/13(日) 23:24:18
フィールド=インスタンス変数
じゃないぞ
フィールド=メンバ変数=インスタンス変数&クラス変数
が正しい
0940デフォルトの名無しさん2009/09/14(月) 10:52:05
普通にネストしてるクラス定義があります

class A
class B
class C
end; end; end

A B C を模したモジュール M があります

module M
module A; def hoge; end
module B; def hoge; end
module C; def hoge; end
end; end; end; end

で、M を適度に include して A.new.hoge も B.new.hoge も C.new.hoge も有効にしたいんですが、
次のような書き方しかできないような気がします

class A; include M::A
class B; include M::A::B
class C; include M::A::B::C
end; end; end

なんというかこー、せっかく模したので「一発」でできるようにしたいのですが、なんかうまい方法ないですか
0941デフォルトの名無しさん2009/09/14(月) 11:04:18
include M しただけで A::B::C.new.hoge が有効にならないのはなんでとかそういう質問?
0942デフォルトの名無しさん2009/09/14(月) 13:13:31
>>940
標準機能にはないし、ライブラリもなさそうだから、自分でつくるしかないかなあ。

def get_module_object(name)
 mod = Object
 name.split(/::/).each do |s|
  mod = mod.const_get(s) or raise NameError.new("#{name}: not found.")
 end
 return mod
end

get_module_object('M::A::B::C')

def include_recursively(klass, namespace)
 mod = get_module_object("#{namespace.name}::#{klass.name}")
 klass.class_eval { include(mod) } if mod
 for name in klass.constants
  c = klass.const_get(name)
  include_recursively(c, namespace) if c.is_a?(Class)
 end
 nil
end

include_recursively(A, M::A)
p A.ancestors    #=> M::A が含まれている
p A::B.ancestors   #=> M::A::B が含まれている
p A::B::C.ancestors #=> M::A::B::C が含まれている

実行効率はあんまりよくないけど許して。
0943デフォルトの名無しさん2009/09/15(火) 01:18:30
このスレの人で、RubyをPSPで動かした経験のある方いますか?
ググりましたが、断片的に
ttp://www.rubyist.net/~matz/20070130.html
ttp://www.javaeye.com/topic/50494(中国語)

があるくらいです。
何か役に立ちそうなサイトがありましたらお教え下さい。
0944デフォルトの名無しさん2009/09/15(火) 09:29:00
StringIOを読むときってrewind必須?
昔のテープメディアみたいでなんかヤなんだけど
0945デフォルトの名無しさん2009/09/15(火) 09:50:31
>>944
IO自体がテープメディアみたいなもんなんだけどw
0946デフォルトの名無しさん2009/09/15(火) 10:21:36
to_s で最初から最後までが文字列として返ってこなかったっけか

同名モジュールの include で疑問があったことを思い出した

module A
 def hoge; B.new; end
end
module B; end

class A; include A; end
classB; include B; end

これで、A.hoge すると モジュール B の new メソッド(無論ない)を呼ぼうとするんだよ
全く以って書いてある通りに動いてるだけなんでございまするが、
module A を作る時点で、include 先から見た B クラスを使うように指定することはできんもんかね
0947デフォルトの名無しさん2009/09/15(火) 10:42:03
>>946
できない…と思う
include したらたまたま同名の自作クラス B があったためにモジュールが動作しませんとかモジュールの意味ねえよ
モジュール内部で呼ぶ B はモジュールが定義されたときに(モジュール内部に)存在する B だ

:: で始まる「フルパス」で書くしかないな
include されるクラス名が不定なのならお隣クラス B を呼ぶことはそもそもできないので諦めるべし
0948デフォルトの名無しさん2009/09/15(火) 10:47:53
>>946
module A
def hoge ; self.class.const_get(:B).new ; end
:
0949デフォルトの名無しさん2009/09/15(火) 11:17:23
コード中で、あるライブラリがrequireされているかどうか判断することはできますか?
擬似コードですが、こんな感じで書けたらと思ってます
if nkfがrequireされていたら; ・・・
elsif uconvがrequireされていたら; ・・・; end

現在はbeginブロックに入れてNameErrorで判断しています
0950デフォルトの名無しさん2009/09/15(火) 11:49:19
>>949
そのライブラリが何か定義するなら
defined? NKF
とか。

あと、$LOADED_FEATURES ($") というグローバル変数もあるが、
ファイル名べったり依存になるのであまり推奨したくないな。
0951デフォルトの名無しさん2009/09/15(火) 12:09:44
require自体がファイル単位を扱うメソッドなんだからファイル名依存になるのは当たり前だろ
09529492009/09/15(火) 12:17:34
>>950
ありがとうございます!どちらも気づきませんでした・・・
プログラムを書き換えてみての動作確認もうまくいきました。
0953デフォルトの名無しさん2009/09/15(火) 12:38:57
>>951
requireされてるかわからないということは自分以外がrequireしたってことだから
ファイル名を知らないし知る必要もないと思う

require 'lib/example'
require './lib/example'
$LOAD_PATH << "lib/"
require 'example'
とりあえず実際問題として、$"ではこれらが区別されるから(requireも二重ロードをする)
>>950のようなduck type的アプローチのほうがよいかと
0954デフォルトの名無しさん2009/09/15(火) 13:12:18
Rubyでよく言うダックタイピングってJavaなんかで言うポリモーフィズムのことですか?
実装の違いは別として機能的には。
レス数が950を超えています。1000を超えると書き込みができなくなります。