トップページ⇒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
0508デフォルトの名無しさん2006/12/19(火) 17:25:45
>>507
>↓ここが、それに関する説明っぽいけど、
ここのことかな?
http://www.ruby-lang.org/ja/man/?cmd=view;name=%BC%C2%B9%D4#a.a5.ed.a1.bc.a5.ab.a5.eb.ca.d1.bf.f4

正直、このページ全体が酷い出来だな。
むしろこっちを読むべきじゃないかな。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%CA%D1%BF%F4%A4%C8%C4%EA%BF%F4#a.a5.ed.a1.bc.a5.ab.a5.eb.ca.d1.bf.f4

これでわからなかったら、また聞いてくれ。
0509デフォルトの名無しさん2006/12/19(火) 19:41:38
たしかにxyzzyのruby-modeはあんまりいけてないな。なんとかしてほしい。
>>500
xyzzyのruby-modeにおけるインデントがおかしいといってるだけであって、
ruby自体は何も非難していない。
被害妄想乙。
0510デフォルトの名無しさん2006/12/19(火) 20:09:49
>>509
じゃあスレ違いだ。xyzzyのスレに行ってやれ。
0511デフォルトの名無しさん2006/12/19(火) 23:14:41
>>506-507
まずクロージャ(closure)について勉強しろ。
理解できるまでは無理してdefine_method使うな。
0512デフォルトの名無しさん2006/12/20(水) 10:39:42
すみません。説明を放棄して使う奴の実力が足りないんだってことにしておきます。
0513デフォルトの名無しさん2006/12/20(水) 11:21:47
学習に必要なキーワードを提示してる人間を何故煽る
closureについてわからない所があれば、そこでまた質問すればいいんだ
そんなにスレを荒らそうとしないでくれ
0514デフォルトの名無しさん2006/12/20(水) 11:22:49
うぜ
0515デフォルトの名無しさん2006/12/20(水) 11:43:40
君たちが回答者という立場を満喫するべく質問を欲しそうにしていたから
質問をしてあげたんだ。
君たちは謝辞を述べてから、競い合うように簡潔にして丁寧な解説を
披露しあうべきではないのかね?
0516デフォルトの名無しさん2006/12/20(水) 12:20:38
簡潔で分かりやすい解説は、その人自身の習熟度の指標でもある。
0517デフォルトの名無しさん2006/12/20(水) 15:45:21
簡潔でわかりやすい質問は、その人自身の成長性の指標でもある。
うまく質問ができない人は、必要な回答を得られないので、成長性が低くなる。

よい回答が習熟殿の指標足りうるのは、よい質問があってこそ。
テストの問題と一緒だな。
0518デフォルトの名無しさん2006/12/20(水) 15:56:07
>>517
> うまく質問ができない人は、必要な回答を得られないので、
回答できない言い訳はどうでもいい。
ただ良い回答があればそれでいい。
0519デフォルトの名無しさん2006/12/20(水) 16:10:32
勉強になります!
0520デフォルトの名無しさん2006/12/20(水) 16:18:54
エスパーできる人は、そのことについて熟知している証拠である。
0521デフォルトの名無しさん2006/12/20(水) 16:54:41
ぼくも520さんみたいなエスパーに早くなれるよう
修行とお布施、がんばります!!
0522デフォルトの名無しさん2006/12/20(水) 23:01:50
>>509
xyzzyなら、ruby-mode.lを直接改造して、*ruby-block-beg-re*とかを改造するといいよ。
;(defvar *ruby-block-beg-re*
; "class¥¥|module¥¥|def¥¥|if¥¥|unless¥¥|case¥¥|while¥¥|until¥¥|for¥¥|begin¥¥|do")
(setq *ruby-block-beg-re*
"¥¥<¥¥(class¥¥|module¥¥|def¥¥|if¥¥|unless¥¥|case¥¥|while¥¥|until¥¥|for¥¥|begin¥¥|do¥¥)¥¥>")
とか。ちょっとはましになる。
0523506,5072006/12/20(水) 23:12:33

>>512は私ではありません。
気をわるくしないでください
2chにつながりにくくなって、返事がおそくなりました。m(__)m
お騒がせしてすみませんでした。

みなさん、ありがとうございます。
まずは、クロージャについて勉強しようと思います。

ちょっと、ネットで調べたところ、
自分が知りたい概念と同じような気がします。
0524デフォルトの名無しさん2006/12/21(木) 00:06:43
mswin32だとスレッドが使えないと聞いたのですが

Thread.fork {
while true
puts 'forked thread'
end
}
while true
puts 'main thread'
end

このコードは正しく動いている気がします
いつの間にか使えるようになったのでしょうか?
0525デフォルトの名無しさん2006/12/21(木) 00:31:04
fork違い
0526デフォルトの名無しさん2006/12/21(木) 01:04:48
forkがないってのと、console I/Oすると他のThreadも止まるってのを、
ごっちゃにしてるんじゃなかろうか。
0527デフォルトの名無しさん2006/12/21(木) 01:45:33
うん。ユーザースレッドだからmswin32だろうがスレッドは使えるよね。
0528デフォルトの名無しさん2006/12/21(木) 02:06:38
結局何が使えないんですか?
0529デフォルトの名無しさん2006/12/21(木) 06:31:22
Matz
0530デフォルトの名無しさん2006/12/21(木) 07:16:14
いるいるこういうやつ(笑)
0531デフォルトの名無しさん2006/12/21(木) 07:21:02
(笑)
0532デフォルトの名無しさん2006/12/21(木) 07:29:32
ユーザースレッドってのは、コルーチン?みたいなのかな?
OSのネイティブスレッドではない?

>>529-531
ワロタ。
でも本スレの流れを持ち込むのはやめてくれw
0533デフォルトの名無しさん2006/12/21(木) 07:33:52
>>532
そう、OSのネイティブスレッドではありません。
インタプリタががんばって処理します。
長所は移植性がとても高いこと。
短所はOSの支援を受けられないので、
たとえばSMPの恩恵を受けられないことです。
0534デフォルトの名無しさん2006/12/21(木) 20:02:20
リファレンス眺めてて気づいたのですが
while hoge..fuga
 foo
end
この記法、どういうときに使うのでしょう?
0535デフォルトの名無しさん2006/12/21(木) 21:02:05
>>534
while foo in hoge..fuga
  p foo
end

の間違いじゃ?
それだと無限ループしちゃうyo
0536デフォルトの名無しさん2006/12/21(木) 21:03:20
ごめん間違えた

for foo in hoge..fuga
  p foo
end

0537デフォルトの名無しさん2006/12/21(木) 22:15:42
ドットに複数の意味をもたせた言語デザインが悪い

とか逆切れしてみるのはどうか
0538デフォルトの名無しさん2006/12/21(木) 23:21:37
>>535
if (a==b)..(c == d)
end
みたいなのもあるんだよ。
ただ、可読性が結構低いのでお勧めは出来ないけど。

while hoge..fugaの形では使ったことはないけど
array.each do |e|
 next unless (e == hoge)..(e == fuga)
 ......
end
みたいな形では極稀に使う。
0539デフォルトの名無しさん2006/12/22(金) 10:43:54
ばっかみたい。
0540デフォルトの名無しさん2006/12/22(金) 12:05:15
define_methodとかinstance_evalだとかについて
使い方、使い所などについて懇切丁寧に解説してる
本とかってないですかねえ。
0541デフォルトの名無しさん2006/12/22(金) 13:08:50
わかる奴には説明する必要がなくて、わからない奴は使う必要がない、
というメソッドだからなあ。
なんかあるかねえ。
0542デフォルトの名無しさん2006/12/22(金) 15:48:04
使い方はマニュアル見ればいいけど、
使いどころを説明するのは難しいね。
リフレクションあたりから説き起こして
小冊子一冊分くらいの分量は優にあるテーマだと思う。
0543デフォルトの名無しさん2006/12/22(金) 20:31:24
すみません。お知恵を貸してください。

<状況>
実装がよく分からないクラスObjのインスタンスがあり、Obj#loadで
データを読んでくれます。Obj#loadが受け付ける引数はそのデータを
格納したファイルのファイル名のみです。

<やりたいこと>
手持ちの文字列データを突っ込みたいのですが、新たにファイルを
作ったりできません。

<試してみたこと>
StringIOを使ってみたりしました(NG)。

よろしくお願いします・・・。


0544デフォルトの名無しさん2006/12/22(金) 21:29:55
>>543
まずはソース嫁なんだけど。一応こんな感じでメソッド追加したら?

class Obj
  def load_str(str)
    # 何とかしてObjのインスタンス変数にアクセスする
  end
end

あとは、irbなんかでObjのインスタンス変数やらメソッドやらを調べまくればokだと思う。

0545デフォルトの名無しさん2006/12/22(金) 22:31:28
なんで新たにファイルが作れないんだろう。
Tempfile.new とかでもダメなのかな。
0546デフォルトの名無しさん2006/12/22(金) 22:59:14
loadで型をチェックしてるのかね。
IO.pipeを使って、書き込み側に手持ち文字列を突っ込んで、
読み出し側をloadの引数にすると出来たりしないだろうか。
0547デフォルトの名無しさん2006/12/22(金) 23:05:31
型チェックというか、
> Obj#loadが受け付ける引数はそのデータを
> 格納したファイルのファイル名のみです。
って書いてるから、Obj#loadの中でFile#openとか呼んでるだけなんジャマイカ?
で、File.openの引数にはTempfileとかIO.pipeの読み出し側って渡せる?
05485432006/12/22(金) 23:07:37
wxRubyを使ったGUIアプリをExerbで固めようとしているんですが、
GUIの設定部分をXRC(XML)ファイルとして外に出しており、何とか
これも含めて1つのexeにしたかったのです。

で、Exerbの方は外部データファイルをStringIOオブジェクトとしてしか
取得できないみたいで、一方、wxRubyはXRCをファイルとしてしか
読みません(たぶん)。

まあXRCだけexeとは別に添付ということでもいいんですけど。
こういうときにTempfile.newというのは慣例的あるいは審美的に
アリなんでしょうか?
05495432006/12/22(金) 23:14:58
すいません。レスがかぶってしまいました。
実装がよく分からないというのも、wxRuby(2)だからなんです。
拡張モジュールで、しかもSwigで作ってるらしいので、
ソースを見てもちょっと手に負えない可能性大です。

IO.pipeを調べて、一度それでやってみます。
0550デフォルトの名無しさん2006/12/23(土) 00:12:30
>>538
> if (a==b)..(c == d)
これ?ってどういう挙動すんの?

true..false
true..true
とか、って・・・
うげ、頭てんぱってきた
05515432006/12/23(土) 00:20:36
IO.pipeの読み出し側を渡すというのは上手くいきませんでした。
Tempfileを作って渡す方は上手くいきました。

もともと存在するファイルのコピーを作るというのにちょっと
違和感があったのですが、ともあれ、ありがとうございました。
0552デフォルトの名無しさん2006/12/23(土) 00:39:29
>>550
本スレにあったけど

404 Blog Not Found:{perl,ruby} -nle 'print if /start/../end/'
http://blog.livedoor.jp/dankogai/archives/50720796.html
0553デフォルトの名無しさん2006/12/23(土) 00:39:48
>>550
Rangeオブジェクトじゃなくて、範囲式の特殊な用法。

http://www.ruby-lang.org/ja/man/?cmd=view;name=%B1%E9%BB%BB%BB%D2%BC%B0#a.c8.cf.b0.cf.bc.b0
05545462006/12/23(土) 02:22:42
ファイル名しか渡せないってのをファイルしか渡せないと誤読してた。
混乱させて済まぬ。
0555デフォルトの名無しさん2006/12/23(土) 21:48:03
コアダンプみたいに、ある時点のRubyプログラムの状態を
全部ダンプして復元する方法はありますか?
0556デフォルトの名無しさん2006/12/23(土) 22:12:22
>>555
変数についてなら、Marshal.dump, Marshal.loadが使えるけど
スクリプト全体だと多分ないんじゃないだろうか。
0557デフォルトの名無しさん2006/12/24(日) 00:30:47
>>556
そうですか。ありがとうございます。
0558デフォルトの名無しさん2006/12/24(日) 02:04:24
rubyごとコアダンプすれば(ry
0559デフォルトの名無しさん2006/12/24(日) 02:24:21
お。Binary 2.0ネタ?
0560デフォルトの名無しさん2006/12/24(日) 02:59:48
復元したいってあるからプロセスやスレッド単位でマイグレーションしたいんじゃね。
YARVでできないの?
0561デフォルトの名無しさん2006/12/24(日) 12:11:05
YARVはbytecodeのdump/loadできたと思う。
0562デフォルトの名無しさん2006/12/24(日) 17:00:54
来年こそend廃止。
0563デフォルトの名無しさん2006/12/24(日) 17:49:00
何にすんの?
0564デフォルトの名無しさん2006/12/24(日) 17:54:24
インデント
0565デフォルトの名無しさん2006/12/24(日) 18:21:14
空行
0566デフォルトの名無しさん2006/12/24(日) 19:01:35
空行ってなんか仏教用語っぽいよね字が
0567デフォルトの名無しさん2006/12/24(日) 21:10:11
Rubyって何を造るための言語なんだ?
結局はWeb関連だったらツマランわ
0568デフォルトの名無しさん2006/12/24(日) 22:12:57
おれ個人での用途ではWeb関連で使ったのは20%くらいだな。
バッチ処理やデータ処理で使うことのほうが多い
0569デフォルトの名無しさん2006/12/24(日) 22:18:03
perl++
0570デフォルトの名無しさん2006/12/24(日) 22:39:08
いま>569がいいこと言った!
0571デフォルトの名無しさん2006/12/25(月) 00:20:58
P2Pソフト
0572デフォルトの名無しさん2006/12/25(月) 00:24:37
rakeで質問なんですが、
以下のように、xsltで、xmlを変換するRakefileを書いています。

COPY_DIR = "../html"
SRC = FileList["*.xml"]
DOCUMENTS_DEST = SRC.ext("html").map{ |item| File.join(COPY_DIR, item) }
TEMPLATE_XSL = "template.xsl"

desc "rake all"
task :all => [:all_documents]
task :all_documents => DOCUMENTS_DEST

rule '.html' => [lambda { |f| File.basename(f.sub(/\.html$/, ".xml")) }] do |t|
  sh "xsl #{t.source} #{TEMPLATE_XSL} #{t.name}"
end

TEMPLATE_XSLが変更された場合に、一番下の、rule(xslを呼び出している所)を
呼びたいのですが、いい方法はないでしょうか?

Makefileの場合、

$(COPY_DIR)%.html: %.xml $(TEMPLATE_XSL)
  $(XSLT) $< $(TEMPLATE_XSL) $@

のように書けばよかったのですが・・・
05735722006/12/25(月) 00:31:26
fileタスクの場合は、以下のようにして、複数ファイル関連付けができるのですが
ruleの場合はどうやったらいいのかな、と思ったしだいです。

file INDEX_DEST => [INDEX_SRC, TEMPLATE_XSL] do
  sh "xsl #{INDEX_SRC} #{TEMPLATE_XSL} #{INDEX_DEST}"
end
05745722006/12/25(月) 00:39:11
こっちに
http://pc8.2ch.net/test/read.cgi/tech/1154077799/429-433

あたりにありますね。試してみます
05755722006/12/25(月) 00:44:50
以下のように、書き換えたことろできました!

rule '.html' => [lambda{TEMPLATE_XSL}, lambda{ |f| File.basename(f.sub(/\.html$/, ".xml")) }] do |t|
  sh "#{XSLT} #{t.sources[1]} #{TEMPLATE_XSL} #{t.name}"
end

お手数掛けました。
0576デフォルトの名無しさん2006/12/25(月) 08:11:35
>>567
俺はguiスクリプトをガリガリ書いてる
apolloがあれば大抵のことは出来るしな

というか、逆にrubyに出来ない事ってなんだろう
0577デフォルトの名無しさん2006/12/25(月) 13:46:15
>>576
OSを書くとか、どうよ。
0578デフォルトの名無しさん2006/12/25(月) 14:23:11
>>576
処理速度を要求されるのは苦手だろう
0579デフォルトの名無しさん2006/12/25(月) 14:26:13
civilization4のMOD作成
0580デフォルトの名無しさん2006/12/25(月) 15:05:21
>>579
Civ4はPythonインタプリタ内蔵だったな。
0581デフォルトの名無しさん2006/12/25(月) 15:07:52
>>576
今後リリースされるバージョンでも確実に動くアプリケーション書いてみろ。
0582デフォルトの名無しさん2006/12/25(月) 15:17:33
なに急にいきりたって
あさっての方向に「指令」出してんだろ、この子
05835762006/12/25(月) 15:46:12
>>577
OSって、そもそもアセンブラじゃないと書けないんじゃなかったっけ?
それともC言語やJavaでOS作るのも可能なのだろうか
0584デフォルトの名無しさん2006/12/25(月) 15:49:20
>>583
誰に教わったのそれ
まあランタイム必須なものには無理だ
0585デフォルトの名無しさん2006/12/25(月) 15:49:28
>>583
「OS作る」の定義によるんじゃね?
0586デフォルトの名無しさん2006/12/25(月) 16:44:09
>>583
確かJavaで使ったOSがあったよね。
0587デフォルトの名無しさん2006/12/25(月) 17:32:31
その前にRubyでRubyが書けるようにならないと
0588デフォルトの名無しさん2006/12/25(月) 18:15:07
evalだけでいいすか?
0589デフォルトの名無しさん2006/12/25(月) 18:27:14
rubyでruby実装するのは無理。Lispマンセ
0590デフォルトの名無しさん2006/12/25(月) 18:34:44
ripperはどういう位置づけだっけ?
0591デフォルトの名無しさん2006/12/25(月) 21:52:23
f=File.open("ntl-5.4.tar.gz",'rb')
ff=File.open("an.cyp",'w')
while(f.eof?!=TRUE)
b= f.read(89)
b= key*b;
srand
print "b=",b,"\n"

こうやると89バイトの文字列として読んでしまうので掛け算ができません。
89バイト整数としてファイルから読ませるにはどうすればいいのでしょう?
よろしくお願いします。
0592デフォルトの名無しさん2006/12/25(月) 22:46:50
to_i
0593デフォルトの名無しさん2006/12/25(月) 22:47:57
>>591
力ずくでやるしか知らないが「b = f.read(89)」のあとに

c = 0
b.size.times do |i|
  c = (c << 8) | b[i]
end

とすれば、変数 c に望みの整数値が出来上がる。
バイトオーダはビッグエンディアン。

リトルエンディアンの値が欲しけりゃ times の中を下ので書き換えてくれ。
  c = (c) | (b[i] << (8 * i))
0594デフォルトの名無しさん2006/12/25(月) 22:52:50
rubyって、そんなに桁数多くても計算できるんすか・・・
0595デフォルトの名無しさん2006/12/25(月) 23:13:36
メモリが続く限り
0596デフォルトの名無しさん2006/12/25(月) 23:30:56
ただしfloatは鬼門。
0597デフォルトの名無しさん2006/12/25(月) 23:34:07
89バイトつーと、
irb> 89 * 8 * Math.log10(2)
=> 214.333356912755 桁か。
0598デフォルトの名無しさん2006/12/25(月) 23:37:13
ちょっっぴり長いね
0599デフォルトの名無しさん2006/12/26(火) 00:36:23
>>596
そんなあなたにBigDecimalを
0600デフォルトの名無しさん2006/12/26(火) 03:55:56

7^7^7
つまり7の(7の(7の階乗)乗)乗
の1の位の数字をrubyで計算してみてください
p 7**7**7 でも結果が分かるので
やってみて頂いてもいいのですが
時間がかかるのでもう少し早い方法で
プログラムしてみてください

0601デフォルトの名無しさん2006/12/26(火) 04:31:29
階乗?
累乗じゃなくて?
0602デフォルトの名無しさん2006/12/26(火) 04:38:05
でと、7のn乗の1の位は、
n = 1 -> 7
n = 2 -> 9
n = 3 -> 3
n = 4 -> 1
となるので、以降は7、9、3、1を繰り返す。
ということは、乗数を4で割った余りがわかれば1の位はわかる。
つまり、7の7乗の1の位は3になり、7の(7の7乗)乗の1の位も3。

しまった、プログラム組む前に答えがわかっちゃった。
0603デフォルトの名無しさん2006/12/26(火) 05:48:50
>>593
うまくいきました。ありがとうございます。
逆に復号したいとき、整数から文字列にして表示させるにはどうすれば
いいでしょう?よろしくお願いします。
0604デフォルトの名無しさん2006/12/26(火) 06:03:15
while(f.eof?!=TRUE)
b= f.read(15)
bb=0
b.size.times do |i|
bb=(bb<<8)|b[i]
end
b= key*bb;

print "b=",b,"\n"

while(1)
if(a=rand(key))
#print a,"\n"
break
end
end
while(1)
if(d=rand(k2))
break
end
end

c=(b+a)^d;

ff.write(c)
こんなことやってますが、書き出されたファイルの大きさが計算と違います。
何か間違いがあるのでしょうか?2370バイトのファイルを15バイトづつ
読み込んで256ビットにして書き込みしてます。
11698バイトになってしまいます。どうしてかわかりません。
0605デフォルトの名無しさん2006/12/26(火) 06:34:49
ff.write(c)をバイナリデータとして書き込みたいのですが、
テキストになってしまいます。
0606デフォルトの名無しさん2006/12/26(火) 07:49:13
>>605
つ array.pack
0607デフォルトの名無しさん2006/12/26(火) 08:09:37
undefined method array ?
■ このスレッドは過去ログ倉庫に格納されています