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

Ruby初學者スレッド Part 9

■ このスレッドは過去ログ倉庫に格納されています
0001紅寶石2006/11/21(火) 08:33:42
まずはマニュアル

マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/


前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/

>>2-10
0102デフォルトの名無しさん2006/11/27(月) 00:25:48
>>101
俺は上が好み。
0103デフォルトの名無しさん2006/11/27(月) 00:44:54
>>101
後者はretryの取り扱いミスが怖いので前者
確かにディスクアクセスが余分で気持ち悪いけどね

本当は後者がウツクシイんだろうな、と思う
0104デフォルトの名無しさん2006/11/27(月) 00:51:22
db=PStore.new(file)で存在しないファイルを指定してもdb['hoge']がnilを返すので
泣いたことを思い出した
0105デフォルトの名無しさん2006/11/27(月) 10:03:46
文字列の最後の1文字や2文字を消すにはどのメソッドを使えばよいのでしょうか?
0106デフォルトの名無しさん2006/11/27(月) 10:28:05
sum_string.slice!(-1, 1)とかslice!(-1, 2)とか
0107デフォルトの名無しさん2006/11/27(月) 10:50:54
>>106

(-1, 2) で試したところ、(-1, 1) と同じ結果がでてきたのですが・・・
0108デフォルトの名無しさん2006/11/27(月) 11:44:03
>>105
普通、Rubyでは一発ではできない。
Rubyの文字列枚挙操作は、1バイトを単位として動作し、日本語2バイト文字列を「1文字」として解釈しない。

が、1バイトの英数字だけならStringのsliceメソッドが使える。
>>106はよくある間違い(というかこれ仕様が意地悪)なので注意。
0109デフォルトの名無しさん2006/11/27(月) 11:46:36
>>107
う。すまんボケてた。
後ろ二文字ならslice!(-2, 2)とか、
めんどくさけりゃstr.slice!(-2, str.length)だな。
というかリファレンスのString#slice!を参照
0110デフォルトの名無しさん2006/11/27(月) 11:48:36
>>108
仕様で最後のslice(-1, 1) でしか無理ってことかな。
0111デフォルトの名無しさん2006/11/27(月) 11:50:08
>>105
$KCODEをきちんと指定+実行コスト度外視だったら、
arr = str.split(//)
arr.pop
str = arr.join
とか。
0112デフォルトの名無しさん2006/11/27(月) 11:57:28
>>108-109
ありがとうございました。無事できました。
日本語でも一発でできるようなメソッド装備すればいいのに。
0113デフォルトの名無しさん2006/11/27(月) 11:58:15
>>110
Rubyのstr[-m,n]は「末尾から数えてmバイト目から右→に向かってnバイトを範囲とする」だからね。
直感的には「末尾から数えてmバイト目から左←に向かってnバイト分」だと思うんだが。

>>111
日本語含んだ文字列ではやっぱり正規表現で分割して配列にするしかないのかな。

irb> str="ねこだいすき"
irb> puts str.scan(/(.+?).$/e)
ねこだいす
irb> str2="hoge"
irb> puts str2.scan(/(.+?).$/e)
hog

うーん。
0114デフォルトの名無しさん2006/11/27(月) 13:01:27
文字列を前に追加する場合はどうすればよいのでしょうか?

<< または + を使って

私は 猫が とても 大好き です という各単語(word)を順次イテレータで追加していくと
str = ""
str << word

で、「私は猫がとても大好きです」という文字列になりますよね。 これを
「です大好きとても猫が私は」のように後ろにあるやつを前にしていきたいのですが・・・
0115デフォルトの名無しさん2006/11/27(月) 13:07:51
>>114
そのwordを何で保持してるかに拠るだろ。
Arrayならreverseすればいいし。
0116デフォルトの名無しさん2006/11/27(月) 16:10:51
# self[nth, len]=val
str[0,0] = prefix
# self[regexp]=val
str[/^/] = prefix
# sub!(pattern, replace)
str.sub!(/^/, prefix)
0117デフォルトの名無しさん2006/11/27(月) 16:48:04
>>104
db.root?('hoge')を使うしか。
db['hoge']すると例外が発生してほしいってこと?
0118デフォルトの名無しさん2006/11/27(月) 17:48:53
「トランザクションの対象のファイルを読み込めません」という例外が欲しいんだろう

irb> h=Hash.new
irb> p h['hoge']
nil

これにあわせた動作なんだろうけどな
0119デフォルトの名無しさん2006/11/27(月) 19:35:52
すみません。rubyからshellを使用する場合についてお聞きしたい
ことがあります。
環境:ruby 1.8.5 (2006-08-25) [i386-linux]
Vine Linux 2.6.16-0vl15

自分は、rubyからshellを呼び出すときShellクラスを使っています。
今やっている事は、あるprogram1で作成したテキストファイルをgnuplot
に読み込ませてグラフを自動生成するというものです。

簡単に例を示すと・・・

#Rubyでの処理
==============
==============
==============
#Shellでの処理
sh = Shell.new
sh.system("program1") #gnuplot用スクリプトscript1生成
sh.system("gnuplot","script1") #epsファイルを出力する
#終了

のようにgnuplotを実行させたいんですが、epsファイルが作成されません
でした。しかし、ターミナルから手動でgnuplot script1を実行すると正常
にepsファイルが出力されたので、恐らくsh.system()を呼び出す時のタイミ
ングの問題かと思うのですが、詳しい方の意見を頂けたらとありがたいです。

ちなみにscript1を作成した状態でsh.system("gnuplot","script1")だけを実
行させると正常にepsファイルが作成されました。また、sh.system("gnuplot",
"script1")の前にsleep()で0.2[sec]ほど待つと正常に出力されるのですが、eps
ファイルを作成する数が多いため時間がかかり過ぎてしまいます。最終的にはル
ープを使用して複数のepsファイルを作成するので。
0120デフォルトの名無しさん2006/11/27(月) 20:03:02
>>119
system("program1")
system("gnuplot script1")

とか

`program1`
`gnuplot script1`

じゃダメですか?
0121デフォルトの名無しさん2006/11/27(月) 20:41:05
ファイルから読み込む時、そのファイルの最後の行だけ読み込むにはどうすればいいでしょうか。
大きなファイルを扱うのですが、最後の行だけ欲しいのです。

後ろから100バイト読んで、改行コードが無かったらまた100バイト読む。
という感じで出来るかな?と思ったのですが、
「後ろから読み込む」やり方がわからないです。
0122デフォルトの名無しさん2006/11/27(月) 21:10:25
line = IO.readlines(filename)[-1]
0123デフォルトの名無しさん2006/11/27(月) 21:15:37
>>122
大きなファイル扱うってかいてるじゃんか。
File#seekで読み込み位置ずらしていくのがベストじゃないの?
0124デフォルトの名無しさん2006/11/27(月) 21:17:55
>>121
IO#seek(offset, IO::SEEK_END)
あたりが使えそう…だろうか。
まぁ、めんどいことになるのは確かだ。
01251212006/11/27(月) 21:26:39
>>122-124
なるほど・・・
かなり面倒な事になりそうなんですね。
とりあえず>>124を参考にしてやってみます。
0126デフォルトの名無しさん2006/11/27(月) 22:51:01
>>125
レシピブックにそういう話が載ってたような気がする
01271212006/11/27(月) 23:45:06
>>126
レシピブック、今手持ちに無いので明日見てみようと思います。

それともう一つ問題が。
無限ループしてる訳では無いのですが、巨大なファイルを扱っているので
C:/workshp/test01.rb:142:in `clear': stack level too deep (SystemStackErro
r)
というエラーが出てしまいます。
これについては、
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29569
これが参考になったのですが、gc.c(rubyのソースですよね?)を変更しないといけないし、
そのあとコンパイルも必要になるので、私が触れるレベルじゃなさそうです・・・。
何か解決策はありますでしょうか。
0128デフォルトの名無しさん2006/11/28(火) 01:04:37
>>127
普通の手法で書いてる限り巨大なファイルとスタックオーバーフローは全くなんの関係もない。
Rubyがstack level too deepと言うのは、Rubyがバグってないかぎりは関数呼び出しの階層が深すぎる場合だけ。
噛み砕いて言うと、関数から関数を呼び出してその関数から関数を呼び出して、ってのを数千回繰り返すと起きる。
つまり自分が書いてるコードが悪いだけだ。

プログラムをよく眺めて考えろ。頭の中で実行してみろ。マニュアルを読め。
ところどころでpして結果を確かめろ。思い込みでコードを書くな。
あと思い込みで質問するな。
01291192006/11/28(火) 01:36:42
>>120
レスありがとうございます。
sh.systemをsystem()もしくは``で置き換えたところ、その症状は改善されました。
ただ、組み込み関数sytem()やバッククオート記法``を使用する場合、Pathはプログ
ラム開始時のカレントディレクトリからの相対パスしか受け付けてくれません。

例えば、
$PWD=top/にいるとき・・・

system("mkdir under/")
system("chdir under/")
system("program1")
system("gnuplot script1")

を行うとtop/under/にではなく、top/にファイル群ができてしまいます。
絶対パスを通せば何とかなりそうですが、後の都合上、相対パスが使いた
い所です。リファレンスなどを当たってみましたが、うまい方法が見付か
りません。カレントディレクトリを変更するのはsystem("chdir under/")
ではダメなのですかねぇ。バッククオートに関しては`cd under/`でエラー
が出てしまい、困っている所です。

度々、質問して申し訳ありません。system()を使った場合、カレントディ
レクトリを変更する方法をご存知の方がいらっしゃいましたら、ご意見を頂
けると助かります。
0130デフォルトの名無しさん2006/11/28(火) 02:01:40
>>129
system()で呼び出されるシェル環境は呼び出される都度
別のサブプロセスになるんじゃなかったけか。
#だから2番目のsystem()でカレントディレクトリを変更しても
# 3番目以降のsystem()にはその影響が及ばない。
system("mkdir under; cd under; program1; gnuplot script1")
としてみたらどうよ。
いやおれはRubyは知らないんだけどね。
手元の環境では上のようにして動いたぞ。
0131デフォルトの名無しさん2006/11/28(火) 02:09:15
>>129
system の中身はシェルなんだから chdir じゃなくて cd。
cd 自体の返り値を使うわけじゃないんだからバッククォートじゃダメ。

system("mkdir under; cd under; program1; gnuplot script1")
0132デフォルトの名無しさん2006/11/28(火) 02:10:55
あ、かぶった。
0133デフォルトの名無しさん2006/11/28(火) 02:18:03
>>129
どうせプログラムの構造について考えないなら黙ってshでやりゃすぐじゃね?
覚えてて損はないし、生きてるうちは廃れないだろ。
0134デフォルトの名無しさん2006/11/28(火) 03:01:14
Rubyで1日悩むものもシェルスクリプトで割り切って作ると1時間くらいでできたりするよな
Rubyとのインターフェースもファイル作ってパイプとかリダイレクトとかで済んだりする
01351272006/11/28(火) 04:59:41
>>128
質問の仕方が悪かったですね。ごめんなさい。
ある研究で、巨大なファイルに10万程度の要素があって、その要素を繋げていくプログラムを作っています。
要素を繋げる為にいくつかの関数を用意してるのですが、関数を1000回程度呼び出した所でstack level too deep
になります。
が、こちらとしては正常な動作なので、もっと要素を繋いで行って欲しい。という訳なんです。

Linuxで動かしてみたら2000回程度呼び出したところでメモリ(2G)から溢れてスワップするようになったので、
仰るとおりプログラムを見直してみようと思います。
Windowsでは、stack level too deepを回避する手段は無さそうですね。
0136デフォルトの名無しさん2006/11/28(火) 06:24:31
呼び出しが再帰になってるんじゃないの?
再帰を非再帰の繰り返しに変更してみな
01371192006/11/28(火) 09:43:00
>>130,131

レスありがとうございました。教えて頂いた方法で解決しました。
解説をして頂いて、どこが問題なのか理解できました。

fork()は、サブプロセスが立ち上がることは知っていたんですが、
system()がサブプロセスになることを知りませんでした。

>>133,134
確かに、最初からshellでやった方が楽だったような気がします。
Rubyで行う処理もあり、shellをRubyから呼び出した方が手っ取
り早いかなぁと最初は思っていたので。

この度は、お手数をお掛けしました。m(_ _)m

0138デフォルトの名無しさん2006/11/28(火) 11:47:14
mkdir程度なら
require 'fileutils'というのもあるがな。
0139デフォルトの名無しさん2006/11/28(火) 11:54:22
おお、mkdir_p があるのか。
0140デフォルトの名無しさん2006/11/28(火) 18:02:27
>>135
再度書くがスタックオーバーフローが起こるのは自分の責任。
そもそもスタックがあふれるようなコードを書くべきでないだけの話。
正常な動作というのも勝手な思い込み。
WindowsもLinuxもその他色々もスタックは有限。
書き方が悪ければいずれにせよいつか起こる。
起こるまでの時間が短いか長いかの違いがあるだけ。
0141デフォルトの名無しさん2006/11/28(火) 18:10:24
winではpython使えってことだな
0142デフォルトの名無しさん2006/11/28(火) 18:11:46
再帰関数でつないでいってるのかな。
0143デフォルトの名無しさん2006/11/28(火) 18:29:17
Rubyは8000行ぐらい以上読ませたりすると
行番号がループする
って話をどっかで聞いた。RHGだっけ。
0144デフォルトの名無しさん2006/11/28(火) 18:37:08
[ruby-dev:29569]に、
Windowsなプラットフォームで、実際に使えるスタックを十分使わな
いうちにstack level too deepになってしまうという問題が…(略)

って話が。
0145デフォルトの名無しさん2006/11/28(火) 19:13:23
カモン186
0146デフォルトの名無しさん2006/11/28(火) 19:27:06
>>144
それは本質ではない。
安直にスタック食い潰して死亡するコードはイクナイという話。
0147デフォルトの名無しさん2006/11/28(火) 21:12:05
50万行程のファイルがるのですが、そのうちの5万行を読み込んで作業する
プログラムを作成しています。


流れとしましては、
50万行ファイルオープン
↓
指定された5万行を配列に格納。
↓
ファイルクローズ

を考えているのですが、配列に5万行を入れて作業するのと
5万行に分割したファイルを読み込むのとではどちらが軽く処理できるのでしょうか?

しょうもない質問ですが宜しくお願いします。
0148デフォルトの名無しさん2006/11/28(火) 21:14:19
>>147
しょうもないと思うなら自分で両方実装してベンチとれや
0149デフォルトの名無しさん2006/11/28(火) 22:04:28
スタックの残りを意識しないといけないプログラミングを強要するプログラム言語はゴミ

とか言ってみる
0150デフォルトの名無しさん2006/11/28(火) 22:41:52
スタックの残りを意識しなくても書けるプログラミング言語って、たとえばなに?
0151デフォルトの名無しさん2006/11/28(火) 22:50:40
チューリングマシン?
0152デフォルトの名無しさん2006/11/28(火) 22:58:03
こういうプログラムを書くとスタックが足りなくなるので注意しましょう

というような解説はあってもいいな
0153デフォルトの名無しさん2006/11/28(火) 23:41:05
>>152
再帰。
0154デフォルトの名無しさん2006/11/28(火) 23:49:51
>>152
入門書では見たことないな
その辺のフォローはあってもいいよね
0155デフォルトの名無しさん2006/11/29(水) 01:30:45
チューリングマシンはプログラミング言語ではありません
0156デフォルトの名無しさん2006/11/29(水) 07:30:22
>150
関数定義もサブルーチンからのリターンもできない言語か
ループは大丈夫だとしても、キツいなw
gotoまみれになりそうだ

配列で仮想スタック作って自前で管理すれば
サブルーチンを扱えるかも知れんが
それはそれでどうなんだろうw
0157デフォルトの名無しさん2006/11/29(水) 08:06:16
スタックレスPythonってあったな。あとレジスタマシンを実装するとか。
0158デフォルトの名無しさん2006/11/29(水) 12:09:24
brainf**kとかだな。
0159デフォルトの名無しさん2006/11/29(水) 13:27:26
ルートウィジェットを表示せずにTk.getOpenFileできる方法ってありますか?

require 'tk'
p Tk.getOpenFile

だとルートウィジェットが表示されてしまいます。

Tk.messageBox(:icon=>'warning', :type=>'ok', :message=>"Hello")

の場合は都合よくルートウィジェットは表示されないのですが,
同じようにできないだろうかと思ってます。
0160デフォルトの名無しさん2006/11/29(水) 13:28:39
pythonをフィヨンと読んでいた俺
本当はパイソンらしい。
0161デフォルトの名無しさん2006/11/29(水) 14:33:42
>>159
Tk.root.withdraw
0162デフォルトの名無しさん2006/11/29(水) 15:03:36
>>161
Thanks
0163デフォルトの名無しさん2006/11/29(水) 17:08:46
10年以上前に卒論のプログラムPythonで書いたが、
指導教官はぜんぜん言語名をまともに呼んだことがなかった。
「ぺいとん」とか「ぴてぃおん」とか。

0164デフォルトの名無しさん2006/11/29(水) 17:17:30
どなたか参考になるサイト、TIPSをお教え願います

rubyで、画像に文字列を表示したいのですが(サウンドノベルゲームみたいなものの、メッセージが表示される枠のイメージ)
また、複数音声のファイル(mp3など)を、ランダムで読み込んで再生といったことをしたいのですが

参考になるようなところお願い致します。。。
vrubyのTIP系はどこをあたればよいのかわからず
0165デフォルトの名無しさん2006/11/29(水) 17:55:18
>>164
そういうのは、Ruby/SDLとか、Miyakoとか使うんじゃない?
0166デフォルトの名無しさん2006/11/29(水) 18:29:38
なるほど、そういうものがあったのですね。
プログラムの関係でvrubyだけで実装しようとしております。
vrubyでの実装方法などとかはないでしょうか?
0167デフォルトの名無しさん2006/11/29(水) 19:59:40
>>166
まあ一度、MIyako使ってみろ。
Windowsでもちゃんと動く。
0168デフォルトの名無しさん2006/11/29(水) 20:02:00
>>166
SWin::Windowのメソッドをみろ。
使い方は、vr/をdopaintで検索すれば概ねわかるだろ。

音声関係は、VisualuRubyの守備範囲じゃなかろう。
0169デフォルトの名無しさん2006/11/29(水) 20:28:53
rubygemで

gem environment

とすると、

$RUBYLIB/rubygems/custom_require.rb:35:in `require': No such file to load -- sources (LoadError)

とでてしまいます。

何かヒントでもいいので、ご教授よろしくお願いします。
0170デフォルトの名無しさん2006/11/29(水) 21:01:06
sources gemはある?

ruby/gems/1.8/gems/sources-0.9.0
とか。
01711692006/11/29(水) 21:12:16
>170
ないです。
0172デフォルトの名無しさん2006/11/29(水) 21:23:50
>>171
ちゃんと用意しろ。
0173デフォルトの名無しさん2006/11/29(水) 21:26:36
>>165 >>167-168
ありがとうございました。やれるだけやってみます。

01741692006/11/29(水) 22:04:03
すみません。rubygemのintsll errorでした。
0175デフォルトの名無しさん2006/11/29(水) 23:26:21
>>146
それは本質ではない。
たった1000程度でスタックを食いつぶす実装はイクナイという話。
0176デフォルトの名無しさん2006/11/29(水) 23:41:01
趣味の言語で何いってんだよ
PUSHは男のロマンだぜ
0177デフォルトの名無しさん2006/11/29(水) 23:44:01
ということ
0178デフォルトの名無しさん2006/11/30(木) 00:51:13
>>113
> 直感的には「末尾から数えてmバイト目から左←に向かってnバイト分」だと思うんだが。

それは俺の直感には思いっきり反するんだが、どうしてくれる。
0179デフォルトの名無しさん2006/11/30(木) 07:15:21
Rubyで他の関数に配列引数を渡したいときはどうすればいいですか?
Cだと

int gauss(int A){
hoge
}

int a(){
int C[10][10],i,j;

for(i=0;i<10;i++){
for(j=0;j<10;j++)
C[i][j]=1;
}

gauss(C);
}

で配列Cの中身はそのまま渡されるんですが・・・
0180デフォルトの名無しさん2006/11/30(木) 07:56:52
>>179
Cでは関数に配列を渡すというより
単なるアドレスを渡すという事になると思うんだけど。
#include <stdio.h>
int array_size(int *p)
{
return sizeof(p);
}
int main(void)
{
int a[] = {0,1,2};
printf("%d\n", sizeof(a));
printf("%d\n", array_size(a));
return 0;
}

それにそのコードだとコンパイルエラーでしょ?
0181デフォルトの名無しさん2006/11/30(木) 08:37:12
173ですが
画像に文字を表示させるのは
フレーム型のbitmappanelを下に表示して、文字を出すことでなんとかいけました。
あとは音だけなのですが
ttp://vruby.sourceforge.net/samples.html のマルチメディア再生でいけると踏んでいるのですが
任意のフォルダ以下(sound/○○.mp3)のmp3ファイル(連番)をランダムでENTERを押したときに再生といったことをやろうとしていて
ディレクトリを読み込む段階で倒れてしまいました。。。
ご指導お願い致します。
0182デフォルトの名無しさん2006/11/30(木) 08:52:09
どうやって配列引数渡すのか早く教えろ
0183デフォルトの名無しさん2006/11/30(木) 09:03:48
>>182
ヒント:google
0184デフォルトの名無しさん2006/11/30(木) 09:09:47
>>182
どうして配列が渡せないと思うのか早くコードで示せ
0185デフォルトの名無しさん2006/11/30(木) 09:11:45
配列に対する操作しか乗ってない。
具体的に配列を如何生成するかとか、他の関数に如何渡すのかとか、
添え字はどう参照されるのか基本的なことが何もかかれてない。
これじゃ他言語から新しく覚えたくてもわからん。
0186デフォルトの名無しさん2006/11/30(木) 09:13:12
渡せるコードのサンプルが全然落ちてないから。
0187デフォルトの名無しさん2006/11/30(木) 09:23:36
少なくともCと同じやり方では渡せない。
0188デフォルトの名無しさん2006/11/30(木) 09:41:05
>>185
def print_array(a)
a.each{|v| print v, ' ' }
end

a = [2,3,4,5,6]
print_array(a)
0189デフォルトの名無しさん2006/11/30(木) 09:57:14
添え字の範囲を間違えていた・・・orz
スマソ
0190デフォルトの名無しさん2006/11/30(木) 12:52:22
>>181
Dir.glob
0191デフォルトの名無しさん2006/11/30(木) 13:07:12
>>179
「Cもまったくわかってません。」まで読んだ。
0192デフォルトの名無しさん2006/11/30(木) 13:49:37
勉強のため、rubyでsuffix arrayを作っています。

----
str = "hogehoge"
sarray = Array.new(str.size){ |i| i }.sort_by{ |i| str[i..-1] }
sarray.each{ |i| puts str[i..-1] }
----
e
ehoge
ge
gehoge
hoge
hogehoge
oge
ogehoge
----

これで動作するんですけど、マルチバイトの場合はもちろん失敗します。
マルチバイト対応で何とかならないですかね?
0193デフォルトの名無しさん2006/11/30(木) 19:14:38
>>192 自己解決しました。

----
str = "ほげhogeほげ"

i = 0
sarray = []
while i < str.size
  sarray.push i
  if str[i].chr =~ /[\xA1-\xFE]/ then i += 2
  else i += 1 end
end
sarray = sarray.sort_by{ |i| str[i..-1] }

sarray.each{ |i| puts str[i..-1] }
----
eほげ
geほげ
hogeほげ
ogeほげ
げ
げhogeほげ
ほげ
ほげhogeほげ
----

単純に2バイト文字の場合インデックスを飛ばせば良いんですね。
0194デフォルトの名無しさん2006/11/30(木) 21:19:29
str = "ほげhogeほげ"

$KCODE = "S"
sarray = []
s = str
until s.empty?
  sarray << s
  s = s.sub(/\A./, '')
end
sarray.sort!
puts *sarray
0195デフォルトの名無しさん2006/12/01(金) 10:08:57
すみません教えてください。
class A
 def foo
  処理 A
 end
end
class B < A
 def foo
  super
  処理 B
 end
 def bar
  処理 C
 end
end
hoge = B.new

で、
hoge.barでBではなくてAのfooメソッドを呼びたいのですが
メソッドbarの処理Cは、どのように書けば良いでしょうか。

0196デフォルトの名無しさん2006/12/01(金) 10:31:08
class A
def foo; puts "foo in A"; end
end
class B<A
alias :foo_A :foo
private :foo_A
def foo; super; puts "foo in B"; end
def bar; foo_A; puts "bar in B"; end
end

irb(main):012:0> B.new.bar
foo in A
bar in B
0197デフォルトの名無しさん2006/12/01(金) 10:57:25
def bar
a_foo_unbound = self.class.superclass.instance_method(:foo)
a_foo = a_foo_unbound.bind(self)
a_foo.call
end

もっと簡単に書けるかしら。
01981952006/12/01(金) 10:57:57
>>196
ありがとうございました、できました。

classBでaliasをdef foo〜endの前に記述したのでfoo_Aはオーバーライド前の
classAのfooを示しているという理解でよいでしょうか?
private宣言をする意味が良くわかりません。
01991952006/12/01(金) 11:01:29
>>197
ありがとうございます、動きました。
でも、難しすぎてワケわかりません、精進します。
0200デフォルトの名無しさん2006/12/01(金) 11:06:17
>>199
>>197はinject並だから安心しろ
>>196のほうがなんぼか素直だ
02011952006/12/01(金) 11:13:12
>>200
ありがとうございます。
後々のことも考えて理解できる>>196を使用します。
■ このスレッドは過去ログ倉庫に格納されています