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
0152デフォルトの名無しさん
2006/11/28(火) 22:58:03というような解説はあってもいいな
0153デフォルトの名無しさん
2006/11/28(火) 23:41:05再帰。
0154デフォルトの名無しさん
2006/11/28(火) 23:49:51入門書では見たことないな
その辺のフォローはあってもいいよね
0155デフォルトの名無しさん
2006/11/29(水) 01:30:450156デフォルトの名無しさん
2006/11/29(水) 07:30:22関数定義もサブルーチンからのリターンもできない言語か
ループは大丈夫だとしても、キツいなw
gotoまみれになりそうだ
配列で仮想スタック作って自前で管理すれば
サブルーチンを扱えるかも知れんが
それはそれでどうなんだろうw
0157デフォルトの名無しさん
2006/11/29(水) 08:06:160158デフォルトの名無しさん
2006/11/29(水) 12:09:240159デフォルトの名無しさん
2006/11/29(水) 13:27:26require 'tk'
p Tk.getOpenFile
だとルートウィジェットが表示されてしまいます。
Tk.messageBox(:icon=>'warning', :type=>'ok', :message=>"Hello")
の場合は都合よくルートウィジェットは表示されないのですが,
同じようにできないだろうかと思ってます。
0160デフォルトの名無しさん
2006/11/29(水) 13:28:39本当はパイソンらしい。
0161デフォルトの名無しさん
2006/11/29(水) 14:33:42Tk.root.withdraw
0162デフォルトの名無しさん
2006/11/29(水) 15:03:36Thanks
0163デフォルトの名無しさん
2006/11/29(水) 17:08:46指導教官はぜんぜん言語名をまともに呼んだことがなかった。
「ぺいとん」とか「ぴてぃおん」とか。
0164デフォルトの名無しさん
2006/11/29(水) 17:17:30rubyで、画像に文字列を表示したいのですが(サウンドノベルゲームみたいなものの、メッセージが表示される枠のイメージ)
また、複数音声のファイル(mp3など)を、ランダムで読み込んで再生といったことをしたいのですが
参考になるようなところお願い致します。。。
vrubyのTIP系はどこをあたればよいのかわからず
0165デフォルトの名無しさん
2006/11/29(水) 17:55:18そういうのは、Ruby/SDLとか、Miyakoとか使うんじゃない?
0166デフォルトの名無しさん
2006/11/29(水) 18:29:38プログラムの関係でvrubyだけで実装しようとしております。
vrubyでの実装方法などとかはないでしょうか?
0167デフォルトの名無しさん
2006/11/29(水) 19:59:40まあ一度、MIyako使ってみろ。
Windowsでもちゃんと動く。
0168デフォルトの名無しさん
2006/11/29(水) 20:02:00SWin::Windowのメソッドをみろ。
使い方は、vr/をdopaintで検索すれば概ねわかるだろ。
音声関係は、VisualuRubyの守備範囲じゃなかろう。
0169デフォルトの名無しさん
2006/11/29(水) 20:28:53gem environment
とすると、
$RUBYLIB/rubygems/custom_require.rb:35:in `require': No such file to load -- sources (LoadError)
とでてしまいます。
何かヒントでもいいので、ご教授よろしくお願いします。
0170デフォルトの名無しさん
2006/11/29(水) 21:01:06ruby/gems/1.8/gems/sources-0.9.0
とか。
0171169
2006/11/29(水) 21:12:16ないです。
0172デフォルトの名無しさん
2006/11/29(水) 21:23:50ちゃんと用意しろ。
0173デフォルトの名無しさん
2006/11/29(水) 21:26:36ありがとうございました。やれるだけやってみます。
0174169
2006/11/29(水) 22:04:030175デフォルトの名無しさん
2006/11/29(水) 23:26:21それは本質ではない。
たった1000程度でスタックを食いつぶす実装はイクナイという話。
0176デフォルトの名無しさん
2006/11/29(水) 23:41:01PUSHは男のロマンだぜ
0177デフォルトの名無しさん
2006/11/29(水) 23:44:010178デフォルトの名無しさん
2006/11/30(木) 00:51:13> 直感的には「末尾から数えてmバイト目から左←に向かってnバイト分」だと思うんだが。
それは俺の直感には思いっきり反するんだが、どうしてくれる。
0179デフォルトの名無しさん
2006/11/30(木) 07:15:21Cだと
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:52Cでは関数に配列を渡すというより
単なるアドレスを渡すという事になると思うんだけど。
#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画像に文字を表示させるのは
フレーム型のbitmappanelを下に表示して、文字を出すことでなんとかいけました。
あとは音だけなのですが
ttp://vruby.sourceforge.net/samples.html のマルチメディア再生でいけると踏んでいるのですが
任意のフォルダ以下(sound/○○.mp3)のmp3ファイル(連番)をランダムでENTERを押したときに再生といったことをやろうとしていて
ディレクトリを読み込む段階で倒れてしまいました。。。
ご指導お願い致します。
0182デフォルトの名無しさん
2006/11/30(木) 08:52:090183デフォルトの名無しさん
2006/11/30(木) 09:03:48ヒント:google
0184デフォルトの名無しさん
2006/11/30(木) 09:09:47どうして配列が渡せないと思うのか早くコードで示せ
0185デフォルトの名無しさん
2006/11/30(木) 09:11:45具体的に配列を如何生成するかとか、他の関数に如何渡すのかとか、
添え字はどう参照されるのか基本的なことが何もかかれてない。
これじゃ他言語から新しく覚えたくてもわからん。
0186デフォルトの名無しさん
2006/11/30(木) 09:13:120187デフォルトの名無しさん
2006/11/30(木) 09:23:360188デフォルトの名無しさん
2006/11/30(木) 09:41:05def 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スマソ
0190デフォルトの名無しさん
2006/11/30(木) 12:52:22Dir.glob
0191デフォルトの名無しさん
2006/11/30(木) 13:07:12「Cもまったくわかってません。」まで読んだ。
0192デフォルトの名無しさん
2006/11/30(木) 13:49:37----
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----
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$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:57class 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:08def 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:25a_foo_unbound = self.class.superclass.instance_method(:foo)
a_foo = a_foo_unbound.bind(self)
a_foo.call
end
もっと簡単に書けるかしら。
0198195
2006/12/01(金) 10:57:57ありがとうございました、できました。
classBでaliasをdef foo〜endの前に記述したのでfoo_Aはオーバーライド前の
classAのfooを示しているという理解でよいでしょうか?
private宣言をする意味が良くわかりません。
0200デフォルトの名無しさん
2006/12/01(金) 11:06:17>>197はinject並だから安心しろ
>>196のほうがなんぼか素直だ
0202デフォルトの名無しさん
2006/12/01(金) 17:26:58alias_methodはシンボル2つ。メソッドなので,で引数を区切る必要あり。
なんで二通りあるんだろう。
0203デフォルトの名無しさん
2006/12/01(金) 17:55:19二通りある理由は、機能が違うから、としか言いようがないかな。
0204デフォルトの名無しさん
2006/12/01(金) 19:07:070205デフォルトの名無しさん
2006/12/01(金) 19:30:26変わりません。
0206デフォルトの名無しさん
2006/12/01(金) 21:05:02その通り。
private にしているのは、意図せず foo_A で外から呼ばれないようにしたいなあという意思表示です。深い意味はありません。
ところで、
class C<B
def foo_A; puts "foo_A in C"; end
end
とすると、
irb(main):006:0> C.new.bar
foo_A in C
bar in B
=> nil
うーん、これはまあ仕方ないが。これ以上頑張るなら>197
0208デフォルトの名無しさん
2006/12/02(土) 03:39:140209デフォルトの名無しさん
2006/12/02(土) 13:54:310210デフォルトの名無しさん
2006/12/02(土) 14:12:30timesメソッドの中にif文を入れて,もし条件を満たしていれば
timesメソッドから抜けたいのですが,どうすればいいのでしょうか。
if文の中でbreakしてもtimesメソッドからは抜けられなかったので質問しました
どうかよろしくお願いします
0211デフォルトの名無しさん
2006/12/02(土) 14:33:543.times do |n|
break if n%2 == 1
puts n #=> 0だけ表示される
end
#=> 全体として nil が返る
一体どんなコード書いたんだ?
0212デフォルトの名無しさん
2006/12/02(土) 16:49:130213デフォルトの名無しさん
2006/12/02(土) 19:53:39メージ的にはこんな感じ
csv = CSV.open('file.csv', 'r')
p csv.size ##-> 行数
Arrayにしてから数えるしかないのでしょうか?
0214デフォルトの名無しさん
2006/12/02(土) 21:02:29csv を扱うライブラリーに"csv.rb"がある
マニュアルは下記、HPで。( rubyのマニュアルにあるHPはリンク切れ)
http://dev.ctor.org/doc/csv/
行数だけなら↓のようになるかな
require "csv"
filename = 'hoge.csv'
i = 0
CSV.open(filename, 'r') do |x| i += 1 ;end
p i
0215デフォルトの名無しさん
2006/12/02(土) 21:04:06nlines = open('file.csv').read.delete("^¥n").size
全部読んで、改行以外を抹殺して改行だけになったら文字数を数える。
つーかsystem("wc")するとか…
0216デフォルトの名無しさん
2006/12/02(土) 22:30:15----
case '\n':
lines++;
/* Fall through. */
case '\r':
case '\f':
if (linepos > linelength)
linelength = linepos;
linepos = 0;
goto word_separator;
case '\t':
linepos += 8 - (linepos % 8);
goto word_separator;
case ' ':
linepos++;
/* Fall through. */
----
だそうなので、Rubyが自前で\nを数えても wc とやってることは結局いっしょっぽい。
というか、wc だからといって何かすごい小細工があるわけでもない模様。
ファイルを全部メモリに保持するときのメモリの圧迫が気になるなら
ファイルを数百バイトずつ読んで捨てつつ改行だけカウントすれば。
0217デフォルトの名無しさん
2006/12/02(土) 22:40:48まあ、ファイルの改行をカウントするためだけに
ファイル開いて全部舐めてカウントして捨てて閉じるというのは
なんとなく無駄というかもったいない感じはしなくもない
0218デフォルトの名無しさん
2006/12/02(土) 22:46:06すみません。。。ボタンを押すとフォルダの中のファイル(0000.wav〜0009.wav)をランダムに再生するものを作りたいのですが
Dir.globでの操作が上手くいかず。。。お願いします。
下のはとりあえず、1個ずつ読み込んで再生しようと思ったのですが、最後しか再生されません。
VRMediaViewをmmとして、読み込むファイルをfnとして再生させています
def open_clicked
@mm.mediaclose
dirname = "sound/hoge"
Dir.glob("#{dirname}/*.wav").sort.each do |fn|
@mm.mediaopen(fn) if fn
@mm.play
end
end
これをランダムにしたいのですが、どのようにすればよいのか。。。お願い致します
0219デフォルトの名無しさん
2006/12/02(土) 22:49:31ランダムにしたいというのはどういうことなのか考える
次に、ランダムを表現するためのメソッドとかを探してみる
んで、そのメソッドをどう利用すればランダムに「なる」か考えてみる
即っとコード出しちゃう人もいそうだけど
0220デフォルトの名無しさん
2006/12/02(土) 22:56:31入門書や解説サイトには必ずある例題だと思うんだけど…
組み込み"関数"の rand を使うと乱数がもらえるぞ
0221デフォルトの名無しさん
2006/12/02(土) 23:05:37Dir.globとの組み合わせのところでうまくいかず。。。
それからディレクトリが1個読み込んで再生ではなく、一度に全部読み込んで最後だけ再生となってしまって
色々試行していたのですが、、、助け舟を頂きたく
0222デフォルトの名無しさん
2006/12/02(土) 23:13:48君が参考にしてる解説本あるいは解説サイト晒せ(w
p で色々調べるといい。
Ruby では、ドットの「前」にあるオブジェクトがどういう状態になってるか常に意識しれ。
具体的に言うと Dir.glob("#{dirname}/*.wav") がどういう風になってるか p で調べてみ。
調べたら、それをランダムに選ぶにはどうしたらいいか考える。
0223デフォルトの名無しさん
2006/12/02(土) 23:31:16ttp://www.osk.3web.ne.jp/~nyasu/software/vrproject.html
p ですか…すいません。。。仰っている意味が理解できずです
もう一度 print("hello world\n")からやり直してきます。。。
ただ、時間がもうあまり無く、解答だけでもいただけるとありがたいです。
0224デフォルトの名無しさん
2006/12/02(土) 23:41:350225デフォルトの名無しさん
2006/12/02(土) 23:43:340226デフォルトの名無しさん
2006/12/02(土) 23:57:38target = list[ (list.size() * rand()).to_i ]
p target
0227デフォルトの名無しさん
2006/12/03(日) 00:06:03ソースのとおり変更したら上手くいきました。
ただこれでは自分の身にならないので、どこのサイトで勉強をすればよいのかお教え願えますでしょうか
自分ではこのソースは書けないので。。。
本当にありがとうございました
0228デフォルトの名無しさん
2006/12/03(日) 00:06:13つーか rand(list.size) で用済まないか
0229デフォルトの名無しさん
2006/12/03(日) 00:06:540231デフォルトの名無しさん
2006/12/03(日) 00:10:260232デフォルトの名無しさん
2006/12/03(日) 00:15:34動作は一緒
英単語上のニュアンスの違いしかないんじゃないかな
「整数にする」と「切り捨てる」の違い
"3.14"を3にしたい場合は"3.14".to_i
3.14を3にしたい場合は3.14.truncate
ただ、こういうくだらないとこに拘る奴が中にいるとプロジェクトは混乱する(w
0233デフォルトの名無しさん
2006/12/03(日) 00:18:00教えてください。
Ruby/Qteなのですが、
dic = open("/home/zaurus/.anthy/private-dic.src")
dictxteuc = dic.read
dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC)
@dicedit.setText(dictxtu8)
#$defaultCodec.toUnicode
end
とすると、@diceditとしたQmultiLineEditの中の感じがすべて文字化けしています。
なにがわるいんでしょうか?教えてください。
ちなみに/home/zaurus/.anthy/private-dic.srcの中身は、EUC-JPのハズです。
0234デフォルトの名無しさん
2006/12/03(日) 00:29:351.8系だと Dir.glob("#{dirname}/*.wav") はwin環境だとちょっとまずい。
まじでさっさと対応版出して欲しい。
0235233
2006/12/03(日) 00:36:55教えてください。
Ruby/Qteなのですが、
def yomikomi
dic = open("/home/zaurus/.anthy/private-dic.src")
dictxteuc = dic.read
dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC)
@dicedit.setText(dictxtu8)
end
とすると、@diceditとしたQmultiLineEditの中の感じがすべて文字化けしています。
なにがわるいんでしょうか?教えてください。
ちなみに/home/zaurus/.anthy/private-dic.srcの中身は、EUC-JPのハズです。
0236デフォルトの名無しさん
2006/12/03(日) 00:42:10Qte のことは分からんが、どこが悪いか、まずは、各行の後でデバッグ出力出してみろ
(文字化け避けるため、それぞれ別のファイルに出した方がいいな)
まずは「どこ」が悪いのか特定するんだ。
0237デフォルトの名無しさん
2006/12/03(日) 00:58:31どうまずいの?
0238235
2006/12/03(日) 01:04:37出力された物はは確かに思った出力ではないのですけどね。
0239デフォルトの名無しさん
2006/12/03(日) 01:19:19def errlog(text,name)
File.open("/home/zaurus/rubyerror-#{name}.txt",'w'){|f|
f.write(text)
}
end
def yomikomi
dic = open("/home/zaurus/.anthy/private-dic.src")
dictxteuc = dic.read
errlog(dictxteuc,'euc') # 確認用出力
dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC)
errlog(dictxtu8,'utf8') # 確認用出力
@dicedit.setText(dictxtu8)
end
こうしてみろってことだろ、要は。
rubyerror-euc.txtがちゃんとEUC-JPかどうか、
rubyerror-utf8.txtがちゃんとUTF8かどうか確かめろってことかね
0240デフォルトの名無しさん
2006/12/03(日) 01:26:28dic = open("/home/zaurus/.anthy/private-dic.src")
open("1.txt","w").print dic
dictxteuc = dic.read
open("2.txt","w").print dictxteuc
dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC)
open("3.txt","w").print dictxtu8
まぁ、デバッガとか使えば、もっと楽なんだろうがな。
0241240
2006/12/03(日) 01:27:120242デフォルトの名無しさん
2006/12/03(日) 01:31:16仮に出力してる感がわかりやすくていい
0243235
2006/12/03(日) 01:36:22ほんとにありがとうございます。
ちなみに、ファイルは正確に変換されていたようです。
とすれば、最後の方の@dicedit.setText(dictxtu8)と
送られた先のQmultiLineEditのあたりがあやしそうですね。
ちなみに、これが初めてのプログラムなので習うというよりも、
習熟度がきわめて低いのが発想力のなさの一因なのでしょうねorz
0244デフォルトの名無しさん
2006/12/03(日) 01:39:40悩め、苦しめ、ジタバタしろ。
それが貴様の血となり肉となる。
orz する必要は全くない。
0245デフォルトの名無しさん
2006/12/03(日) 01:46:53QTe のことは分からんが、そのソースで理論上うまくゆく「はず」
ということであれば、環境変数とか設定ファイルとか、
初期化ルーチンあたりで設定するパラメータとかの値が悪いんでないかい?
(そんなもんがあるとしたらの話だが)
0246デフォルトの名無しさん
2006/12/03(日) 01:48:35ありがと。もう少しがんばってみるよ。
QmultiLineEditクラスは、マルチバイト扱ってくれんのかなぁ。
0247デフォルトの名無しさん
2006/12/03(日) 01:52:470248デフォルトの名無しさん
2006/12/03(日) 01:58:14それやってみます。m(. .)m
0249デフォルトの名無しさん
2006/12/03(日) 02:25:39sjisのbyte目が []{} なんかと被ると誤動作する。
0250235
2006/12/03(日) 02:26:13@dicedit.setText(tr(dictxtu8))
~~~
翻訳(translate)しなきゃだめだよね。
これ、一回こうなおしたと思ったのに・・・・
みんなありがと。とりあえず寝ます。
0251デフォルトの名無しさん
2006/12/03(日) 12:11:20nil.to_s が "" を返すということは積極的に使っていいもんですか?
「キー hoge がハッシュ h に登録されてないか登録されてても値が空("")のとき true」を
h['hoge'] == nil or h['hoge'].empty?
ではなく
h['hoge'].to_s.empty?
と書くのは邪悪?
0252デフォルトの名無しさん
2006/12/03(日) 12:28:06やめといたほうがいい。あれは結局引っ込んだのかな。引っ込んだとしても
またいつ復活するか分からんしなー。
railsの構成要素である active_support の blank? を使う方がいいかもしれない。
nil, 0, "", [] などに対して真を返す。
■ このスレッドは過去ログ倉庫に格納されています