Ruby について Part 3
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNGRuby Home Page
http://www.ruby-lang.org/ja/
<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/
<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0893デフォルトの名無しさん
NGNGBecky!用のRuby pluginってのはある。
あとtalkではたびたびアプリケーションに組込むって話がでてるけど、
具体的な製品名は分からない。
0894デフォルトの名無しさん
NGNGできれば、Win版とUNIX版両方で。
0895デフォルトの名無しさん
NGNGttp://metaeditor.sourceforge.net/embed/
0896デフォルトの名無しさん
NGNGああ、それなら知ってるけど、どうしていまさら後方互換性をなくす方向に
動き出したんだろ。2.0への布石?
0897デフォルトの名無しさん
NGNG> 動き出したんだろ。2.0への布石?
そんなとこだと思うけど。
arityに関しては、たしかに分かりにくいという声が以前からあったし。
0898デフォルトの名無しさん
NGNG一時期の出版ラッシュのついでに出しておいてくれれば良かったのに。
0899デフォルトの名無しさん
NGNGCマガあたりに記事がなかったっけ?
Web上でも読めた気がする。
0900デフォルトの名無しさん
NGNG本じゃないが、erubyなんかはいい例にならないかな。
0901デフォルトの名無しさん
NGNG0902784
NGNG>ruby -ve "File.open '-'"
ruby 1.6.8 (2002-12-24) [i386-mingw32]
-e:1:in `open': No such file or directory - "-" (Errno::ENOENT)
from -e:1
0903デフォルトの名無しさん
NGNG0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNG具体的に質問します。
コマンドラインでファイル名が指定されたらそれを、
指定されなければ標準入力を開くって処理をしたいんです。
Perl だと
push(@ARGV, "-") if no @ARGV
foreach (my $file @ARGV) {
open(F, $file);
#ほげほげ
}
とかできて楽なんですけど、Rubyだとどう書くんですか。
ファイル単位で(ファイル名を意識して)処理したいんで、ARGFは却下です。
0906デフォルトの名無しさん
NGNGなんかいろいろ間違ってる・・・Perl久しぶりとはいえ・・・欝だ。
0907デフォルトの名無しさん
NGNGf = (file == '-' ? STDIN : open(file))
begin
# ほげほげ
ensure
f.close unless f == STDIN
end
end
0908デフォルトの名無しさん
NGNGif file == '-'
yield STDIN
else
open(file, &block)
end
end
ARGV.each do |file|
reading(file) do |f|
# ほげほげ
end
end
0909デフォルトの名無しさん
NGNG>ファイル単位で(ファイル名を意識して)処理
ARGF.file や ARGF.filename 使えば。
0910デフォルトの名無しさん
NGNGtar だって cat だって UnixTool はみんな - が標準入力じゃないか。
なんで STDIN を特別扱いしなきゃいけないだ。
めんどくさいだけじゃないか。
#ほげほげ
そうか、いろんな - がありえるんだ
- が標準入力じゃなくてもいいんだ。
Perl がやりすぎなんだ・・・
ボクは Ruby が好きなんだ!
ボクはここいいたい!!
ボクはここにいてもいいんだ!!!
ところで amrita って便利ですね。
0911デフォルトの名無しさん
NGNG> ARGF.file や ARGF.filename 使えば。
うーん。そうなんですけど、なんかうまくいかなくて。
やりたいのはファイル名とファイルの全内容を
もとに処理をしたいのです。
def hogehego(filename, content)
# ほげほげ
end
↑こんな感じ。で・・・
while not ARGF.eof?
puts ARGF.filename
puts ARGF.file.readlines.size
end
こうすると最初のファイルしか処理されなくて、
じゃあ while not ARGV.empty? ってすると
標準入力から読み込んでしまってわけわからん。
ARGFの挙動が理解できないんですけど。
0912784
NGNGこうすれば全ファイル処理された。
while not ARGF.eof?
puts ARGF.filename
puts ARGF.file.readlines
ARGF.skip
end
でもファイルを指定しなかった場合の挙動がいや・・・
というか誰か↓を解説してくれ。まじでわかんねぇ。
>ruby -e "puts ARGF.filename" hoge.rb
-
>ruby -e "ARGF.eof?; puts ARGF.filename" hoge.rb
hoge.rb
0913デフォルトの名無しさん
NGNG$ ruby -e '%w(foo bar).each{|f| File.open(f,"w") << "1\n1\n"}'
$ ruby -ne 'BEGIN{p ARGF.filename}; p ARGF.filename' foo bar
"-"
"foo"
"foo"
"bar"
"bar"
$ awk 'BEGIN{print FILENAME}; {print FILENAME}' foo bar
foo
foo
bar
bar
$
0914デフォルトの名無しさん
NGNGARGVで指定されたファイルを触るのをぎりぎりまで先送りにしたいからでは?
ファイルを開かないことには eof? の真偽を知ることが出来ないから
eof? のあとでは指定された名前のファイルの存在も分かる。
しかしfilenameを知るために(詳しくいえばfilenameで返される名前のファイルの
存在を保証するためだけに)ファイルを開くのは許せないとか。
存在を保証するためなら File::readable?(ARGV.first) という手もあるが、
readable? では実際に読みにいったときにファイルがまだあることを保証できない。
もっともこれだけでは最初にSTDINをさしている理由は説明できないがね。
0915R
NGNGいま、自分で考えているオンラインゲームがありまして
それの実現に、Rubyを使ったサーバプログラムを考えているので
第1歩として、多人数向けのチャットサーバを作ろうと思い作り始めたのですが
多人数向けのエコーサーバは「Rubyライブラリ編」を参考に(ほとんどそのまま)で
つくり、うまくいったのですが、ある端末から他の端末へ文字を送る方法で
悩んでいます。
配列を使い、TCPServerのインスタンスを配列の中に入れようと考えたのですが
どうも、うまくいきません。
先輩方、どうかアドバイスをお願いいたします。
0916デフォルトの名無しさん
NGNG「どこまでやって、どこでつまづいたか」を具体的に書いた方が
回答を得やすいと思われ。
0917R
NGNGはい、了解しました。
エコーサーバを改造してこんな風に書いてみたんです。
require "socket"
gs = TCPServer.open(8888)
online = []
while TRUE
ns = gs.accept
print(ns, " is accepted\n")
Thread.start {
s = ns
online.push(ns)
while str = s.gets
x = 1
while x <= online.size do
online[x].write(str)
x+=1
end
end
print(s, " is gone\n")
s.close
}
end
うまくいけば、接続している人全部にメッセージを送ることが
できるはずなんですが、誰にもメッセージが帰ってこないのです。
自分なりに調べたところでは、配列の中身がいつの間にか
無くなっているっぽいのです。
0918デフォルトの名無しさん
NGNGとりあえず、while str = s.gets ... end の中がよくわかんないんだけど、
こんなんでどう?
online.each do |c|
c.write(str)
end
あとは、s.close のあとで online.delete(s) とか。
0919R
NGNGうまくいきました、ありがとうございます。
while str = s.gets ... end の中が間違っていたってことなんですよね
どこが良くなかったのだろ?
でも、online.each使ったほうが簡潔で解りやすいですね。
またお世話になるかもしれません。そのときは皆様よろしくお願いいたします。
0920デフォルトの名無しさん
NGNGクライアントが一つだけ接続に来たとき、そのソケットは online[0] のはずだが、
x = 1 から始まるので online[1] を参照にいき、online[1] == nil であるから、
nil.write(str) が実行される。この時点でそのスレッドは死ぬが、
デフォルトでは Thread 内で例外が起こっても黙っているので分かりにくい。
ruby -d server.rb のように -d つきで実行すると上の状況が分かるだろう。
0921デフォルトの名無しさん
NGNG> Thread.start {
> s = ns
> online.push(ns)
もし online.push(ns) する前にメインスレッドに切り替わって
ns = gs.accept が成立すると、ns は予期しないものになっている。
よってこうした方が良い
Thread.start(ns) { |s|
online.push(s)
あるいはロジックは少し変わるがこれでも良い
online.push(ns)
Thread.start(ns) { |s|
0922R
NGNG配列は、0からはじまるのですか。
だからnilを参照してたのですね。
自分の間違えが、わかりすっきりしました。
>921
了解しました。
仰るとおりに、タイミングしだいではnsは
不定になります。
下のほうが、より確実っぽい気がするので
これでいってみたいと思います。
みなさま、ありがとうございました
0923デフォルトの名無しさん
NGNGaa = 111 #0
return binding
end
def f1(bb, a_bind) #1
cc = 222 #2
eval "p aa, bb, cc", a_bind #3
end
f1(333, f0)
上のスクリプトで、#3 の eval のとき、aa(#0), bb(#1), cc(#2)
の指すオブジェクトを eval に評価させる式の中でいっしょに使い
たいのですが、よい方法はあるでしょうか? この場合の結果は
111
333
222
が欲しいということになります。
質問の意図がわかりにくいかと思いますが、誰か教えてくれるとうれしい。
0924デフォルトの名無しさん
NGNGdef f0
aa = 111 #0
return binding
end
def f1(bb, a_bind) #1
aa = eval("aa", a_bind)
cc = 222 #2
eval "p aa, bb, cc" #, a_bind #3
end
f1(333, f0)
0925923
NGNG解答ありがとう。でもそれではだめなんです。923で説明が足りなくてスマソ。
f1の定義の時点で a_bind のコンテキストに存在する変数aaについては知らんのです。
#3 のところでやりたいことは、a_bindにメソッドf1の定義で出てきたローカル変数を
追加したコンテキストで #3 の行の評価をする、ということです。以下のスクリプト
の方が923のより多少は意図が伝わりやすいかも…
def f0
aa = 111 #0
return binding
end
def f1(bb, expr, a_bind) #1
cc = 222 #2
eval expr, a_bind #3
end
f1(333, "p aa, bb, cc", f0) #4
0926923
NGNGいませんでした、すまそ。以下のスクリプトみたいな方法で、とり
あえず問題は解決できそうです。
class Data
attr_accessor :aa
end
def hoge(bb, expr, bind)
data = eval("self", bind)
cc = 111
data.instance_eval(expr)
end
d = Data.new
d.aa = 222
bind = d.instance_eval { binding }
hoge(333, "p aa, bb, cc", bind)
0927デフォルトの名無しさん
NGNGdef empty_binding
binding
end
def marged_binding(*bindings)
dst = empty_binding
bindings.each do |src|
eval("local_variables",src).each do |var|
id = eval(var, src).id
eval("#{var} = ObjectSpace._id2ref(#{id})", dst)
end
end
dst
end
def f0
aa = 111 #0
return binding
end
def f1(bb, expr, a_bind) #1
cc = 222 #2
eval expr, marged_binding(binding, a_bind)
end
f1(333, "p aa, bb, cc", f0) #4
0929デフォルトの名無しさん
NGNGDataは標準の組込みクラスで、new(1.6)やallocate(1.8)は定義されてない。
0930デフォルトの名無しさん
NGNG0931デフォルトの名無しさん
NGNGまぁそうだろうな。
ともあれDataのインスタンスは作れないし、拡張ライブラリ使うならDataはい
じらんほうが身のため。
0932デフォルトの名無しさん
NGNG名前が一般的過ぎてよくないよね。
0933デフォルトの名無しさん
NGNGつか、漏れは obj.id とか obj.hash とかでハマったことあり・・・
0934デフォルトの名無しさん
NGNGidははまったなあ。hashは知ってたんで、はまったことないけど。
0935デフォルトの名無しさん
NGNG__id__かobject_idならかぶらんだろ。
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG1.
while $in = STDIN.gets
$in.chomp!
print $in + "\n"
end
2.
while $in = "11"
print $in + "\n"
end
なぜ1のプログラムは動いて、2のプログラムは
動かないのでしょうか?
僕が考えると、1が動く方が不思議なんですが。
というのも、while文というのがwhileのうしろが
trueの時に処理を行なっているのなら、
上のプログラムのように、whileの後で代入をおこなっている(つまり、なにも値を返していない)
ような場合は、ともにエラーがでると思います。
どう考えればいいのでしょうか?
0938デフォルトの名無しさん
NGNGとは言え、Dataという名前のクラスは作りそうで作らない気がする。
0939デフォルトの名無しさん
NGNG0940デフォルトの名無しさん
NGNG0941937
NGNGプログラミング自体、畑違いなので
聞ける人がまわりにいません。
教えてください。お願いします。
0942デフォルトの名無しさん
NGNG2のほうも動くだろ。
0943デフォルトの名無しさん
NGNG0944デフォルトの名無しさん
NGNG次の二点を確認して、放課後までに職員室に来なさい。
・代入は値を返さない?
・偽はfalseとnil。では真は?
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNGC言語の質問?
0947デフォルトの名無しさん
NGNGrubyの質問なんですが・・・?
0948デフォルトの名無しさん
NGNG0949デフォルトの名無しさん
NGNGhoge1.rb:
class Hoge
def hoge
"ほげ1"
end
end
hoge2.rb:
class Hoge
def hoge
"ほげ2"
end
end
があるとき、自前でファイルを開いて
require 'hoge1'
module A; end
File.open("./hoge2.rb"){|f|
A.module_eval f.read
}
p Hoge.new.hoge #=>"ほげ1"
p A::Hoge.new.hoge #=>"ほげ2"
のようにやっているのです、もっとシンプルにTop Levelではなくユーザの導入した名前空間への
requireやloadのようなことを行う方法はありますか?
0951デフォルトの名無しさん
NGNGもしも「C の rint と log に相当するのはRubyでは何?」ってことなら、
log(x) は Math::log(x) で rint(x) は x.round
ちなみに rint は C の標準関数じゃないよ。
0952デフォルトの名無しさん
NGNG句読点の使い方
0953デフォルトの名無しさん
NGNG今んとこ、ない。loadの第二引数にModuleを使えるように、という話はtalkで
ちょっとだけ出てるようだ。
0954デフォルトの名無しさん
NGNG作れないわけじゃないよ。
消しちゃうなり、Object以外を継承させれば別物になる。
class Object;remove_const(:Data);end
class Data < NilClass;end
0955945
NGNG> log(x) は Math::log(x) で rint(x) は x.round
ご教示ありがとうございます。
0956デフォルトの名無しさん
NGNG1.CのrintとlogにあたるものはRubyではどんな関数なんでしょう?
2.CではRubyのrintとlogにあたるものはどんな関数なんでしょう?
1だろうか、と思いきや2だったか。
0957デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNG0959デフォルトの名無しさん
NGNGrequire "tk"とすると見つからないようです。
/usr/lib/ruby/1.6/tk.rb:7:in `require': No such file to load -- tcltklib (LoadError)
from /usr/lib/ruby/1.6/tk.rb:7
from ./btn:3:in `require'
from ./btn:3
0960945
NGNG(snip)
準拠
rint() 関数は BSD 4.3 に準拠する。その他の関数は C99 から導入された。
(snip)
失礼しました。
0961デフォルトの名無しさん
NGNG(snip)
HISTORY
A rint() function appeared in Version 6 AT&T UNIX.
(snip)
失礼こきます
0962デフォルトの名無しさん
NGNG[A,B0,B1,C0,C1,D]を
foo.a #->A
foo.b[0] #->B0
foo.b[1] #->B1
foo.c[0] #->C0
・
・
と代入する方法を教えてください
0963962
NGNG言葉足らずなところもあると思いますが、よろしくお願いします。
0964デフォルトの名無しさん
NGNGfoo.a = A
foo.b[0] = B0
foo.b[1] = B1
foo.c[0] = C0
・
・
0965デフォルトの名無しさん
NGNG0966デフォルトの名無しさん
NGNGハイハイ、とりあえず、rintはPOSIXやC99にはない環境依存な関数だってことはわかったからね。
0967デフォルトの名無しさん
NGNG最近さびしいので。
0968デフォルトの名無しさん
NGNG書いてくれ。
0969967
NGNG0970デフォルトの名無しさん
NGNG0971デフォルトの名無しさん
NGNG0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNGモジュールを名前空間独立に書くっていつでもできるの?
例えば、以下の状況で A#bar() がこの A::foo() を
呼ぶことを保証できるんだろうか?
module A
def A::foo() end
def bar() A::foo() end
end
0976デフォルトの名無しさん
NGNG> module A
> def A::foo() end
> def bar() A::foo() end
> end
この後でA.fooを再定義されたら、当然「この A::foo()」が呼ばれることはないけど、
クラス/モジュールやメソッドの定義時の名前空間のネストは実行時に再現される。
0977デフォルトの名無しさん
NGNG0978デフォルトの名無しさん
NGNGhttp://ttsky.net/ruby/ruby-dl.html
>>980
次スレよろ
0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG0981980
NGNGRubyの実装に疑問あり!
http://pc2.2ch.net/test/read.cgi/tech/1004873294/
0982980
NGNG【Ruby】RubyでCGI
http://pc2.2ch.net/test/read.cgi/php/988948655/
0983デフォルトの名無しさん
NGNGRuby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/index.html
0984デフォルトの名無しさん
NGNGhttp://www.rubyxml.com/
0985デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/unix/1045705000/
【UNIX板】goRua(Ruby/Gtkによる2chブラウザ)ってどうよ。
http://pc.2ch.net/test/read.cgi/unix/1008120213/
【プログラム板】Ruby について Part 3
http://pc2.2ch.net/test/read.cgi/tech/1042004759/
【プログラム板】Rubyの実装に疑問あり!
http://pc2.2ch.net/test/read.cgi/tech/1004873294/
【WebProg板】【Ruby】RubyでCGI
http://pc2.2ch.net/test/read.cgi/php/988948655/
【WebProg板】ゲームを作ろう!【PHP】【Perl】【Ruby】【ASP】
http://pc2.2ch.net/test/read.cgi/php/1030267927/
【WebProg板】/*Perl.Ruby.php以外でCGI*/
http://pc2.2ch.net/test/read.cgi/php/1004107967/
0986980
NGNGオブジェクト指向スクリプト言語Rubyについて扱うスレッドです。
Ruby Home Page
http://www.ruby-lang.org/ja/
= 前スレ
* Ruby について Part 3
http://pc2.2ch.net/test/read.cgi/tech/1042004759/
= 過去スレ
* Rubyについて Part 2
http://pc3.2ch.net/tech/kako/1028/10289/1028906179.html
* Rubyについて
http://pc3.2ch.net/tech/kako/1012/10120/1012096319.html
0987980
NGNG== [UNIX板]
* rubyを語るスレッド 3
http://pc.2ch.net/test/read.cgi/unix/1045705000/
* goRua(Ruby/Gtkによる2chブラウザ)ってどうよ。
http://pc.2ch.net/test/read.cgi/unix/1008120213/
== [プログラム技術板]
* Rubyの実装に疑問あり!
http://pc2.2ch.net/test/read.cgi/tech/1004873294/
== [WebProg板]
* 【Ruby】RubyでCGI
http://pc2.2ch.net/test/read.cgi/php/988948655/
* ゲームを作ろう!【PHP】【Perl】【Ruby】【ASP】
http://pc2.2ch.net/test/read.cgi/php/1030267927/
= その他リンク
* Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
* <rubyXML/>
http://www.rubyxml.com/
0988980
NGNG0989デフォルトの名無しさん
NGNGそれよりこっちのがじゅーよー。
Matzにっき
http://www.rubyist.net/~matz/
0990980
NGNG0991980
NGNGRuby について Part 4
http://pc2.2ch.net/test/read.cgi/tech/1056944114/
0992デフォルトの名無しさん
NGNGレス数が950を超えています。1000を超えると書き込みができなくなります。