Ruby初心者質問スレPart2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
05/02/08 03:02:27Ruby Home Page
http://www.ruby-lang.org/ja/
前スレ
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/
本スレ
Rubyについて Part 14
http://pc5.2ch.net/test/read.cgi/tech/1103997158/
0159デフォルトの名無しさん
2005/04/09(土) 17:02:16ゆるされる表現だと思いますがjの初期化位置が違うのではないでしょうか
0160デフォルトの名無しさん
2005/04/09(土) 17:06:08ありがとうございます。
恥ずかしい限りです。
0161デフォルトの名無しさん
2005/04/20(水) 15:04:30挙動がわかんないのでご教授願いたく・・・
require 'net/http'
target = "localhost"
path = "/"
h = Net::HTTP::new(host=target)
p h
p h.get(path)
Thread.start{
h = Net::HTTP::new(host=target)
p h
p h.get(path)
}
このコードで一回目はちゃんと200で帰ってくるのですが
スレッドの中のは結果をとってきてくれません。
スレッド中で例外が発生した場合はそのスレッドは死んじゃうとの記述があったので
p h.get(path) rescue p $!
にしてもどうも補足してくれなくて・・・
ちなみに環境はruby 1.8.1 (2003-12-25) [i386-cygwin]です
0162デフォルトの名無しさん
2005/04/20(水) 15:25:27Thread.start{
h = Net::HTTP::new(host=target)
p h
p h.get(path)
}.join
ということでなくて?
これならスレッドが終わるまえにスクリプトが終わってる
0163デフォルトの名無しさん
2005/04/20(水) 15:47:23・・・なるほど
joinしないと作ったスレッドが終わる前にメインスレッドが
終わってしまうということですね。
ありがとうございました。
0164デフォルトの名無しさん
2005/04/25(月) 00:03:030165デフォルトの名無しさん
2005/04/25(月) 00:39:26リファレンスマニュアル見てもわからんの?
前者は行頭に、後者は文字列の先頭にマッチ。
たとえば "a\nb\nc\n" なら、
前者は "a" の前と "b" の前と "c" の前にマッチするが、
後者は "a" の前にしかマッチしない。
0166デフォルトの名無しさん
2005/04/25(月) 23:35:33どうもありがとうございました
0167デフォルトの名無しさん
2005/04/27(水) 00:06:130168デフォルトの名無しさん
2005/04/27(水) 00:23:180169デフォルトの名無しさん
2005/04/27(水) 08:33:13$ ruby -e 'p 1.0/0.0'
Infinity
下記のリファレンスマニュアルでは、メモリサイズの制約だけとありますね。
ttp://www.expansys.jp/product.asp?code=120505
0171デフォルトの名無しさん
2005/04/27(水) 19:42:500172デフォルトの名無しさん
2005/04/28(木) 20:47:220173デフォルトの名無しさん
2005/04/28(木) 21:24:150174デフォルトの名無しさん
2005/04/28(木) 22:32:42お。どんな感じです?近所の書店には未入荷でして。
ネットで予約した方が早かったかな?
0176デフォルトの名無しさん
2005/04/28(木) 23:12:09今37ページでオブジェクトの解説してます。
ruby初めてだけど、他の言語知ってるなら
充分理解できるようにわかりやすくかかれている感じ。
それより先は読んでないからまだ何とも言えないです。
所で、実行ファイルってrb形式のヤツですよね?
実行するとアクセスが拒否されましたってダイアログが出て実行できないんだけど
これは何故なのか…
付属のCD-ROMの収録内容かな?実行環境はLinux?Windows?
Windowsなら、拡張子でRubyインタプリタを関連付いてますか?
あとは文字通りで、何かのアクセス権がないから?
手元にあれば試してみるんだけどなぁ。
0178デフォルトの名無しさん
2005/04/29(金) 00:08:290179デフォルトの名無しさん
2005/04/29(金) 00:12:04winです。
付属のサンプルもですけど、多分ruby全体がダメだと思います。
なんなんだろうか…
アンインストールして入れ直してみるかな
0180デフォルトの名無しさん
2005/04/29(金) 09:21:54という本か。SSTP とか懐しいな。
面白そうだ、俺も買ってみよう。
0181デフォルトの名無しさん
2005/04/29(金) 13:41:21ファイルのプロパティを開いて 読み取り専用のチェックを外す
とよひとおもふ
0182デフォルトの名無しさん
2005/04/29(金) 13:46:03HDDにCPしてから>>181 で、初めて実行可能になるきがするが
0183デフォルトの名無しさん
2005/04/29(金) 16:54:430184デフォルトの名無しさん
2005/04/29(金) 20:25:07……あ、最近ギャルゲもエロゲもあんまりやらなくなったなぁ´`,、(´∀`)´`,、
0185デフォルトの名無しさん
2005/04/29(金) 21:16:39まきまきかわいいよまきまき。
0186デフォルトの名無しさん
2005/04/29(金) 21:42:490187デフォルトの名無しさん
2005/04/29(金) 22:54:320188デフォルトの名無しさん
2005/04/29(金) 23:10:45windowsの表示をクラシックモードにしたりをrubyでやりたいのですが
出来ますでしょうか?
0189デフォルトの名無しさん
2005/04/29(金) 23:57:59http://www.ruby-lang.org/ja/man/?cmd=view;name=win32%2Fregistry.rb
これで何とかならん?
0190デフォルトの名無しさん
2005/04/30(土) 11:08:53例えば、次のようなスクリプトを実行したとします。
rubyのバージョンは1.8.2, Tkのバージョンは8.3.5, OSはLinuxです。
--- ここから ---
#!/usr/local/bin/ruby -Ke
require 'tk'
font = TkFont.new({'size' => '12'})
scr = TkScrollbar.new.pack('fill' => 'y', 'side' => 'right')
txt = TkText.new('font' => font).pack('expand' => 'true', 'fill' => 'both', 'side' => 'right')
txt.yscrollbar(scr)
Tk.mainloop
--- ここまで ---
このとき、TkTextウィジェット内での日本語入力は可能で、同じTkText内でのコピペも問題ありません。
しかし、例えばこのプログラムをふたつ立ち上げて、一方のTkText内の日本語を他方にコピペすると
文字化けしてしまいます。
なにか解決方法はないでしょうか。よろしくお願いします。
Linux上のruby 1.8.2、tk 8.4.9で試したところ、
プログラム間でのコピー&ペーストで文字化けしません。
他のプログラムとの間でも同様に文字化けするのでしょうか?
クリップボードを監視変更するようなプログラムが動作していませんか?
0192190
2005/04/30(土) 15:06:52>他のプログラムとの間でも同様に文字化けするのでしょうか?
問題となっているプログラムを仮にAと呼ぶと
mlterm -> mlterm: OK
mlterm -> A: NG
A -> mlterm: NG
A -> A : OK
ただし、別の新しいプロセスとして立ち上げたものをA'とすると
A -> A': NG
です。
>クリップボードを監視変更するようなプログラムが動作していませんか?
XfceのClipboard Managerが動いていましたが、
これを落としても文字化けしました。
0193デフォルトの名無しさん
2005/04/30(土) 18:19:29print '能'
このプログラムで"が閉じられていないというエラーが出ます。
ちなみにlinuxでは動作しますが、win32だと駄目です。
KCODEの設定をしても駄目みたいです。
こういうことって結構あるのですか?
0194デフォルトの名無しさん
2005/04/30(土) 19:04:59rdindex (1.2.2) を使いたいと思っているのですが、
インストールに失敗します。
$ ruby setup.rb config
とすると、~/.rdindex がないと言われるので、
{package_root}/dot.rdindex をコピーして続行しました。
$ ruby setup.rb setup
とすると、
{package_root}/rdindex-1.2.2/bin/rdindex/rdindex:2:in `require': No such file to load -- rdindex (LoadError)
と怒られます。
どうやらパッケージ内にこのファイルが無いようにも思えます。
({package_root}/setup/rdindex.rb はインストール用?)
正常に使用できるようにするには、どの様にすれば良いでしょうか?
0195デフォルトの名無しさん
2005/04/30(土) 19:25:19print "能\"
とでもしてください。
多分、
print "ソ"
print "表"
あたりでも同じ事が起こると思う。文字コードの問題かと。
0196190
2005/04/30(土) 20:34:33tcl/tk-8.4.9をインストールしてrubyもリビルドして試したところ
文字化けしませんでした。
8.3.5に拘る理由もないので、この機会にバージョンアップすることにします。
ありがとうございました。
0197デフォルトの名無しさん
2005/04/30(土) 22:37:47$KCODEは実行の際に関係する設定だから。
その問題はパースの際の問題なので
Rubyの引数に-Ksするかスクリプトの一番上に#! ruby -Ks
として解決。
0198デフォルトの名無しさん
2005/05/01(日) 01:43:23>>197
サンクスです
0199デフォルトの名無しさん
2005/05/01(日) 02:58:06例えば下のブロックの中に tmp というローカル変数を作りたいのですが
どのように書けば良いでしょうか。
tmp = 1
… {
# ここ
}
print tmp
0200デフォルトの名無しさん
2005/05/01(日) 10:10:13当然、そのスコープでのローカル変数になるから、
素直に、ブロック外かブロック内のどちらかの変数名を変更するか、
別の種類の変数などを利用していく方が、自然じゃないかな。
# for はちょっと特殊なので気をつけよう
0201デフォルトの名無しさん
2005/05/01(日) 18:57:35悲惨な結果になるような気がしてきた。
0202デフォルトの名無しさん
2005/05/01(日) 19:38:14Rubyの仕様上、ムリ。違う変数名にしろ。
というか、こんなことできる言語って他にあるか?
C++だとネストしたブロック内で同名の別変数を使えますね。
そういう言語に慣れてると混乱するかも。
今回の事例だと、変数名を変えるのが無難かも。
あるいは、該当部分を別のメソッドに分割するとか。
0204デフォルトの名無しさん
2005/05/01(日) 20:23:43名前に関係なく自由に変数のスコープを記述できるな。
0205デフォルトの名無しさん
2005/05/01(日) 20:59:10def initialize
@x = "xxx"
end
class B
def initialize
p @x
end
end
end
A::B.new
class A の @x を class B のメソッドから参照するには、どうすれば
Rubyリファレンスマニュアルの下記ページには以下の記述があります。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%A5%AF%A5%E9%A5%B9%A1%BF%A5%E1%A5%BD%A5%C3%A5%C9%A4%CE%C4%EA%B5%C1
> クラス定義はネスト(入れ子)にして定義できます。
> 以下の例で入れ子の外側のクラス Foo と内側のクラス Bar の間には
> (定数 Bar が Foo の中の定数 Foo::Bar であること以外には)
> 継承関係などの機能的な関連はまったくありません。
205のスクリプトの「A::B.new」ではA#initializeを実行することが無く、
そもそもクラスAの@xが存在しません。
普通にAとBのクラスを定義する場合と同じなので、Aの@xを参照するなら、
まずAのインスタンスを作る必要があります。
そして、Aでは「attr_reader( :x )」のようにして参照用のメソッドを
用意しておきます。
もしかして、本来の意図は「class B < A」といった継承関係でしょうか?
0207デフォルトの名無しさん
2005/05/02(月) 13:20:19こういうオブジェクトを e = {"a" => "1", "b" => "2", "c" => "3"}
みたいなハッシュに変換したいんですが
どう書けばいいんでしょ?
3時間ほど悩んでます
とりあえず、こんな感じ?つっこみ歓迎。
def to_hash( array )
hash = Hash.new
array.each do | x |
if /(.+)=(.+)$/ =~ x
hash[ $1 ] = $2
end
end
return hash
end
x = ["a=1", "b=2", "c=3"]
p to_hash( x )
0209デフォルトの名無しさん
2005/05/02(月) 13:37:06p ["a=1", "b=2", "c=3"].inject({}) { |r,e| k,v = e.split(/=/, 2); r[k] = v; r }
0210デフォルトの名無しさん
2005/05/02(月) 13:45:09p ["a=1", "b=2", "c=3"].inject({}) { |r,e| r.store(*e.split(/=/, 2)); r }
0211207
2005/05/02(月) 13:46:51両案とも、あっさりうまくいってしまいました
>>208
正規表現使う案はさすがに思いつかなかったです(わら
>>209, 210
injectは知らなかったです、勉強になりました。
ありがとう
うぁ、injectを忘れてました。まだ頭が1.6系...。
それにsplitで十分かつすっきりしますね。ううむ、まだまだだなぁ。
0213デフォルトの名無しさん
2005/05/03(火) 00:21:03追加していくという流れで、配列、条件分岐から、正規表現、GUI、
webサービス、マルコフ辞書までと幅広い内容です。
ひとつ気になる点としては、作者が死んじゃってることくらいです。
遺稿になっちゃったんですね。
こういう書籍を書ける人が...もったいないなぁ。
0215デフォルトの名無しさん
2005/05/03(火) 09:39:26プログラムの実行を強制的に終了させる命令。
それが無理なら、せめてプログラムの末尾にGOTOさせたいんだけど、そんな命令もない。
まったく不便な世の中になったもんだ。
0216デフォルトの名無しさん
2005/05/03(火) 09:53:13何のために強制終了させたいのか、GOTOが欲しいのかが分かりませんが、
まずは216の通りにexitでしょうねぇ。異常終了を表すならabortというのも。
プログラムの末尾にジャンプさせるということであれば、例外を使う方法もありかも。
begin
何かの処理
if 終了条件 == true
raise
end
rescue
例外処理(あるいは何もしない。)
end
exitなどの詳細はリファレンスマニュアルを参照してみてください。
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4#exit
0218デフォルトの名無しさん
2005/05/03(火) 15:48:19などのサンプル | リファレンス が載ってるところはないでしょうか
0219215
2005/05/03(火) 18:24:10ありが�d(涙)
CGIの書き込みチェックに使いたかったんです。
raiseでムリヤリ例外を発生させてrescue節に飛ばす方がなんとなくRubyらしくてイイですね。
exitは初めて知りました・・・まだまだ知らないことばかりです;
0220デフォルトの名無しさん
2005/05/04(水) 09:56:200221218
2005/05/04(水) 13:59:58スレ汚してすいませんでした。
0222デフォルトの名無しさん
2005/05/04(水) 22:21:07秀丸とかterapadとかrdeとかいろいろあるけど、
どれでやってますか?
0223デフォルトの名無しさん
2005/05/04(水) 22:24:150224デフォルトの名無しさん
2005/05/04(水) 22:38:26ごくまれにviとcat
0225デフォルトの名無しさん
2005/05/04(水) 22:51:360226デフォルトの名無しさん
2005/05/04(水) 22:58:12xemacsのruby-mode。
0228デフォルトの名無しさん
2005/05/05(木) 11:09:18vim
0229デフォルトの名無しさん
2005/05/05(木) 12:48:29おまいら、「Ruby でエディタ何使ってますか?」スレ立ててそこでやれ。
0230デフォルトの名無しさん
2005/05/05(木) 12:53:09Visual Studio
0231デフォルトの名無しさん
2005/05/06(金) 08:11:49a = Array.new(10, 0)
for i in 1..100
case rand(10)
when 0; a[0] += 1
when 1; a[1] += 1
when 2; a[2] += 1
when 3; a[3] += 1
when 4; a[4] += 1
when 5; a[5] += 1
when 6; a[6] += 1
when 7; a[7] += 1
when 8; a[8] += 1
when 9; a[9] += 1
end
end
このやり方だとrand(100)とかrand(1000)にすると、
when 0; a[0] += 1 をたくさん書かないといけません
何かスマートな方法がないでしょうか?
よろしくお願いします
0232デフォルトの名無しさん
2005/05/06(金) 08:16:150233デフォルトの名無しさん
2005/05/06(金) 08:21:10そんなレス付ける暇があったらコードで示してやればいいのに。
性格悪い奴だな。
0234デフォルトの名無しさん
2005/05/06(金) 08:35:420235デフォルトの名無しさん
2005/05/06(金) 08:56:16RDE
0236デフォルトの名無しさん
2005/05/06(金) 13:33:39Ruby にも test/jarh.rb きぼんぬ。
0237デフォルトの名無しさん
2005/05/06(金) 17:17:11ttp://jarp.does.notwork.org/ruby/jarh.rb ←これを入れてもらう?
test/ よりも sample/ の方がいいかもしれない。
sample/ 以下って2年以上変更されてないファイルがほとんどだけど変更しない方針なのかな。
0238デフォルトの名無しさん
2005/05/06(金) 17:33:07こんなソッコーで回答してもらえるとは
ありがとうございました
0239デフォルトの名無しさん
2005/05/06(金) 22:56:54どの言語でもsampleの中って骨董品ばかりじゃない?
0240デフォルトの名無しさん
2005/05/06(金) 23:31:45そんなレス付ける暇があったらコードで示してやればいいのに。
性格悪い奴だな。
0241デフォルトの名無しさん
2005/05/08(日) 12:48:04Rubyって拡張子が cgi だと require できないのでしょうか。
もしそうなのであれば、拡張子が cgi のファイルをテストするいい方法はどのようなものでしょうか。
0242デフォルトの名無しさん
2005/05/08(日) 13:11:400243デフォルトの名無しさん
2005/05/08(日) 13:13:15require "hoge.cgi"
でいけない?
0244デフォルトの名無しさん
2005/05/08(日) 13:32:36現在は、ファイルをコピーして拡張子を rb にのものに置き換える処理のあとに require しています。
もうひとつ質問なのですが、
コンソールでは動くテストケースなのですが、
eclipse の RDT で動かそうとすると、
"起動中" 中に内部エラーが発生しました。
java.lang.RuntimeException: Unable to execute interpreter: -I "C:\data\workspace\ws1\calendar" -I "testunit" -- "No file specified in configuration" testunit/test_calendar.rb 6789 false TCMyCalendar
というエラーが出て、実行されません。
6789 という数字に覚えがないのですが、このエラーを回避するにはどうしたらよいのでしょうか。
0245デフォルトの名無しさん
2005/05/08(日) 13:44:100246デフォルトの名無しさん
2005/05/08(日) 13:52:41*.cgi って Ruby 以外なんでもアリなんだから、
ライブラリをロードする require が *.rb, *.so 限定な方が自然だろう。
> ていうかphpみたいに拡張子.rbにしてもうちょっと自己主張すればいいのに。
どゆいみ?
勘違いじゃなければ、httpd 側の設定の話な気がする。
0247デフォルトの名無しさん
2005/05/08(日) 14:03:03「ある条件を満たす要素以降の要素」に対して
処理をしたい時はどうすればよいのでしょう?
Cで書くなら↓のような感じなのですが
eachを使うと条件を満たした行しか得られないようなので・・
for(i=0; i<MAX-1; i++){
if(array[i] == 条件)
for(j=i; j<MAX-1; j++){
したい処理
}
}
}
0248デフォルトの名無しさん
2005/05/08(日) 14:21:55泥臭くやると
array[ array.index(条件) ... array.length].each { |e|
# eに対して「したい処理」
}
かな。だれかエレガントな解キボンヌ
0249デフォルトの名無しさん
2005/05/08(日) 14:37:13end = array.length
for x in start..end do
したい処理
end
もしくは、
array[start, end].each do |item|
したい処理
edn
とか?
0250デフォルトの名無しさん
2005/05/08(日) 14:41:02あと end = array.length にて end 使ったらマズい悪寒 orz
ブロックの終端以外の end は fin にでも書き換えてくれ
0251247
2005/05/08(日) 14:45:18ありがとうございます。試してみます。
0252247
2005/05/08(日) 14:45:440253デフォルトの名無しさん
2005/05/08(日) 17:00:20同じクラスのクラスメソッドを呼ぶときってどうしていますか?
・AruClass.classmethod()
・self.class.classmethod()
これ以外の方法はあるのでしょうか?
0254デフォルトの名無しさん
2005/05/08(日) 17:02:28例えば hash[:a][:b][:c] に x という別名を作って、
x にvalueを代入すると hash[:a][:b][:c] にも代入される、みたいな事を
したいのですが。
0255254
2005/05/08(日) 18:16:180256デフォルトの名無しさん
2005/05/08(日) 22:55:45なぜそれ以外の方法が必要なのか述べよ(250字)
0257デフォルトの名無しさん
2005/05/09(月) 01:31:37クラス名を書くのはクラス名が変わったとき(あってはならないが)めんどい。
self.class だと長い。
せめて class って直接書いて構文エラーにならなければいいのになぁ。
0258デフォルトの名無しさん
2005/05/09(月) 08:36:38> せめて class って直接書いて構文エラーにならなければいいのになぁ。
予約語だしなぁ。
それにclassを認めるとdefもifもwhileも…とか出てきそうでイヤ。
■ このスレッドは過去ログ倉庫に格納されています