3
5 :
デフォルトの名無しさん :03/06/30 15:38
a=Hoge.new array.push(a) array.last.method() p a で、俺が何がしたいのか分かる? どーすりゃいいの?
>>8 日本語が不自由なことに困っていることは分かったyo
>>5 method() は Object#method のことじゃなくて、
なにか任意のメソッドを適用したいのかなあ?
array.push(a) を array.push(a.dup) に変えるのが正解と大予想
関係ないけど > array.last.method() の () にすげー違和感があるのオレだけ?
括弧がある方が漏れは好きカッコイイ
括弧がある方はJavaみたいでカッコワルイ
究極の選択: method () method( )
1.8では前者は常に(-w付けなくても)警告が出る。
Float('1_000') が 1000.0 になるのに、 '1_000'.to_f が 1.0 になるのは納得いかん。
1.8ではどっちも1000.0になる
21 :
デフォルトの名無しさん :03/07/04 01:33
CGIのプログラムで、受け取るデータの大きさを 制限しようと思うのですが、 どうすればいいでしょうか? IOオブジェクトならgetcしながら、ファイルサイズを 計算すればいい(?)のでしょうが、 CGIオブジェクトはどうすればいいかわかりません。
Apacheのディレクティブ使えば?
>>21 向こうが送りつけてくるものは制限できないから、
受け取ったあとでちょんぎるなりsizeとってエラー出すなりすればいいんじゃないの?
>>21 もしCGIプロセスのメモリ消費を気にしているなら、
CGI#stdinput を再定義して自作のバッファに差し替えるという手もある。
そのバッファオブジェクトは read と binmode だけ持っていれば良い。
25 :
デフォルトの名無しさん :03/07/04 02:14
>>22 自宅サーバーじゃないから残念ながら設定できないです。
>>23 たしかに、sizeとってエラーが一番簡単そうですね。
>>24 一度、挑戦してみます。
ありがとうございました。
CGIといえば、 アップローダみたいに送られてくるデータが大きくなったとき、 データが送られてくるのが完了する前に中断されると CGIオブジェクトの初期化のところで延々と止まってしまう。 どうしたらいいだろうか。
begin timeout(delay){cgi=CGI.new} rescue TimeoutError exit(1) end
RedHat8,にソースからmakeして入れたruby-1.6.8で$0の挙動がなんかおかしい。 print "ContentType: text/plain\n" print $0 ってかいただけのファイルを作ってApache1.3.27+mod_ruby越しに見るとfalse、 コンソールで実行すると空文字列が$0に入ってた。 リファレンスとなんか違うし、このままだと$0 == __FILE__とかが出来ないので困る。 ActiveScript Rubyにくっついてたruby-1.6.8`を使って同じスクリプトを win2kのコンソールで実行すると、$0には実行しているスクリプトの名前が 入ることは確認できたんだが、何が悪いんだろう。ruby入れ直せば直るのかな。
mod_rubyはruby_options()もruby_script()も呼んでないので、$0が初期化されない。 バグだと思うなら、前田さんへ。 コンソールで実行ってのは、普通のrubyコマンドで$0が空だったってこと?
>>29 >mod_rubyはruby_options()もruby_script()も呼んでないので、$0が初期化されない。
$0mod_rubyが正しく動いている時、$0が初期化されていないなら、
$0にはnilが入ってるのかな?
何でfalseが入ってたのだろう。
>コンソールで実行ってのは、普通のrubyコマンドで$0が空だったってこと?
test.rbにprint $0と書いてruby test.rbとすると、出力はContentType: text/plainだけだった。
でも28を書いた後p $0って行を追加してみたら"test..rb"が出力されてきた。
ごめん、空じゃなかったね…。
あと、リファレンス見てprint $0.inspectとやってみたが、出力には何も出てこないようだ。
うーん、やっぱりよく解らない……。
$ ruby --version ruby 1.6.8 (2002-12-24) [i386-cygwin] irb(main):001:0> a = [1,2,3] => [1, 2, 3] irb(main):002:0> a[0,5] => [1, 2, 3] irb(main):003:0> a[1,5] => [2, 3] irb(main):004:0> a[2,5] => [3] irb(main):005:0> a[3,5] => [] irb(main):006:0> a[4,5] => nil 要素無しのArray?
>>30 zsh とか使ってない?プロンプトで出力が消されたんじゃない?ちゃんと改行しとけ。
>>30 > 何でfalseが入ってたのだろう。
$0の実体はrb_prognameという変数で、これはとくに初期化されてないので0になってる。
で、CレベルではQfalse==0ということ。
>>31 部分配列の先頭自体が範囲を外れてるから。
>>35 [1,2,3]が持つ範囲は 0..2 なわけで
a[3,5]の時点で範囲を外れている気がする。
漏れがアフォなだけですか?
この場合、先頭位置は要素の間にあると考えた方がいい。 つまり、3だと最後の要素の後ろになる。 a[2,5] # [1, 2, < 3 ] X X > a[3,5] # [1, 2, 3 < ] X X X > a[4,5] # [1, 2, 3 ] X < X X X > # Xは無効な範囲ね。
>>37 そういうイメージなのですか……。
一貫性がない気がするが……。
予備のスペースとして一個とってあるのかとか色々考えてしまった。
処理的には nil or size == 0 するだけだからいいっちゃいいんだが。
1.8でも変わらんのですか?
1.8でも一緒。 a[4,5].to_a.empty? とか。
>>39 サンキューです。
それで逝きます。
FAQっぽいけど、これって既知?
>>37 正直カンドーした。是非、次の出力も図解して下され。
p [0,1,2][-2..-1]
p [0,1,2][-2..+0]
p [0,1,2][-2..+1]
>>41 マイナスは末尾から数えるというだけで、とくに変わりはないんだが。
> p [0,1,2][-2..-1]
[0, <1, 2>] # size=3, 3-2=1, 3-1=2
> p [>0,<1,2][-2..+0]
(3-2=1) > 0なんで、空
> p [0,1,2][-2..+1]
[0,<1>,2] # 3-2=1
空にならないのは..はendを含むから。
p [0,<>1,2][-2...1]
なら空になる。
ちょっと分かりにくいのはこれかな。
p [0,1,2][0..-4]
X>[<0,1,2]
>>42 > > p [0,1,2][-2..+1]
> [0,<1>,2] # 3-2=1
なるほど、そう考えれば 0 は入らないのか。さんくす
>>11 まさにそれです。ありがとうございました。
45 :
デフォルトの名無しさん :03/07/06 20:06
Rubyを勉強し始めて実はよく分かってない事に気付きました。 '#' と '::' と '.' の違いを分かりやすく教えてください。
46 :
デフォルトの名無しさん :03/07/06 20:08
#include <stdio.h> int main(){ char a='〇',b='●'; int c,n; for(c=1;c<=91;c++){ if(c%2==1){ printf("%s",a); } else if(c%2==0){ printf("%s",b); } for(n=1;n<=9;n++){ if(c==9*n){ printf("\n"); } } } }
>>45 ドキュメントのことだよね?
--- Hoge#moe(arg)
Hogeのインスタンスメソッドmoe()
--- Hoge.nae(arg)
Hogeのクラスメソッドnae()
--- Hoge::SAGE
Hogeの定数SAGE
これは文法と言うよりドキュメントでの慣習。
実際のコードでは、
hoge = Hoge.new
hoge.moe("shine")
Hoge.nae("shine") # Hoge::nae("shine")と書く人もいる。
Hoge::SAGE
と使う。
クラスメソッドに"."を使うか"::"を使うかは好みなのかな?(意味は同じハズ)
48 :
デフォルトの名無しさん :03/07/06 20:47
ありがとうございます。 プログラム中では '::' と '.' は全く同じ意味なんですね。 あと、refeのドキュメントではSingletonメソッドとInstanceメソッドで '.' と '#' を使い分けてる気がします。
すみません。 '.'と'::'が同じなのはクラスメソッドの時だけですね
50 :
デフォルトの名無しさん :03/07/06 22:47
File.openブロック内で例外を投げたらcloseしてくれますか?
>>50 ブロックを抜けるときにcloseする。
だから例外を投げれば、ブロックを抜けないように細工してない限りcloseされるよ。
52 :
デフォルトの名無しさん :03/07/06 23:01
rubyを組み込んだシェアウェアを作ろうかなと思ったんだけど、 これってライセンスに問題ある? 色々検索してみたけどよく分からない・・・
>>53 じゃあやめとけ。
ていうか作ってから言え。
rubyをシェルから簡単に動かしてみたいんですが、 どんな方法があるんでしょうか? 今は $ ruby << EOF puts "AAAA" EOF AAAA とかやってるんですが・・・。
irb じゃだめなの?
>>57 irb、知りませんでした。
これでできそうです。
情報thxです。
59 :
デフォルトの名無しさん :03/07/07 23:14
>>53 デュアルライセンスのArtisticの方を取れば平気では?
検索掛ける前にライセンス文章読むほうがいいと思われ。
60 :
デフォルトの名無しさん :03/07/08 02:56
$ ruby puts "AAAA" ^D AAAA じゃだめなの?
perlも引数がないときは標準入力から読むのか。知らなかった。
>>60 サンキュー
>>55 作ってから「ダメでした」じゃ労力の無駄じゃないか、バカ
>>62 バカのためにわざわざ時間を割いてライセンスについて解説するのも
労力の無駄じゃないか、バカ
>>63 んな事言ってたら掲示板やMLの存在価値が薄くなるじゃん。
そういう人に限って解説出来るほど知識なかったりするんだけどね。
Ruby厨の本性見たり、枯れ尾花
>>64 で、 tarball の COPYING (COPYING.ja) は読みましたか?
だいたい今時シェアウェアなんてはやらねーよ。
68 :
デフォルトの名無しさん :03/07/08 15:15
>>66 それ、サイトにあったから読んだけどよく分かんない。
rubyを組み込んだシェアウェアの場合、”3”に該当すると思うんだけど、
3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ
ルしたオブジェクトコードや実行形式でも配布できます.
(a) バイナリを受け取った人がソースを入手できるように,
ソースの入手法を明示する.
(c) 変更を行ったバイナリは名前を変更したうえ,オリジナ
ルのソースコードの入手法を明示する.
(a)の指すソースというのは、rubyではなく作ったソフト?
(c)で「オリジナル」ってわざわざ書いてるからには、
(a)はrubyが組み込まれたアプリのソースなんだろうな・・・
ならシェアウェアとは相容れない気がする。
>>68 3(a)はRubyそのものをバイナリ配布するときの規定と思われるので、
3(c)にだけ従えばいいんじゃない?
つまり、Ruby embedded なソフトウェアは
1) Ruby と名乗ってはいけない
2) Ruby の入手先を明示する
だけでいいと思う。
バイナリ配布のときは実質的にLGPLになるのかと思ってた
修正BSDくらいの緩いライセンスを志してたはず。 Rite のリリースにあわせてライセンスも変わるのでは。
matzに地元で採れたリンゴでも送っとけばOK。
どっちにしろ、 Ruby で金儲けしたいひとにもやさしいライセンスになるんでしょ?
>>70 regex.[ch]を含むならそうなのでは?LGPLの5と6を読む限りそうとしか思えん。
>>74 さらに、mswin32/mingw32/bccwin32版の場合はwin32/win32.[ch]のライセンスも
絡んでくるのでよくよく考えてみる必要がありそう。
flag = false Thread.start { while !flag do_something end } while line = gets if line.chop == 'end' break end end メインスレッドはユーザーの入力待ち、生成したスレッドはユーザーの終了コマンドが 来るまでずっと何かをし続ける。というスクリプトが書きたかったのですが、 上記のスクリプトだとメインスレッドのgetsのせいで生成したスレッドが動いてくれません。 何か良い方法などがありましたら、教えてください。
すみません環境を書き忘れていました。 WinXP+mswin32バイナリ です。よろしくお願いします。
(σ・∀・)σgets!!
Winは知らんけど、Linuxだとgetsでスレッドは止まらんな。
Native Win32だとgetsはスレッドを止める。FAQだね。
>>80 ガ━━ΣΣ(゚Д゚;)━━ン
そうですか、FAQでしたか・・・
>>76 でしたいことは、
ひたすらデータを集め続け、ユーザーが任意のタイミングで
データ集めを終了させ、集めたデータをメモリからファイルに書き出す。
ということなんですが、別にスレッドを使わなくてもgetsを使わなくても
良いので何か代替案はありませんか?
>>82 それだと、ファイルへの書き出しが出来なくなりませんか?
集めたデータに対して変更をする可能性があるので
データをメモリ上に置いておきたいので、集めた物から逐一書き出し
することは出来ません。最後に必ず実行したいのです。
と、ここまで書いて思い付いたのですが、『最後に必ず』と言うことで、
例外処理のensureでやれそうな気がしました。Ctrl+CのInterrupt例外クラス
を捕捉してやってみようと思います。
>>82 氏サンクス。
stopFlag = false trap(:INT) { stopFlag = true } while !stopFlag do_something end ファイルへの書き出し処理コード ======================================== 上記の方法で、Ctrl+Cでファイルへ書き出して終了させることが出来ました。 皆さん、ありがとうございました。
85 :
デフォルトの名無しさん :03/07/11 17:07
ruby-mswin32(static) をmfcに組み込むと、 終了時にVC.NET がmemory leakだとかいって オブジェクトをdumpずーーっとします。 何か間違ってる可能性がありますか? ちなみに、新規プロジェクトでなんにもない状態から、 ruby_init(); ruby_finalize(); ってやっただけです。 1.6.8 と1.8.0 で両方試してみましたが、ダメでした。
Rubyのメモリリークは仕様です
メモリリークの定義によると思うが。 そういうもんなので気にしなくてよろし。
>>85 組込みクラスとかシンボルテーブルとか、開放しないものはいっぱいある。
Perlにおいても言える事だが、Init_libraryに対するDestroy_libraryがあればいいのにな。
>>90 別に。「あればいい」だけで「なくちゃいけない」とは誰も言ってませんが。
拡張ライブラリだと、見えないとこでどう使われてるか分からんから危険すぎ。
>>89 やっぱ処理系側が面倒見るのがいいんじゃ。
つーかruby_finalize()した後まで色々残ってるってのは気持悪くないのか
正直、これハマりました。 p {"a"=>1} # Error p ({"a"=>1}) # OK
warning: (...) interpreted as grouped expression
>>94 それってmalloc/freeの部分の話も含んでる?
だとしたらfjでの某論争がここに再現するかも(w
>>97 rubyコマンドの話なら、malloc/freeはどうでもいい。
ただ、rubyエンジンをないそうしたアプリケーションの場合は、
ちゃんとfreeした方が良いんじゃないか、とは思うが。
a = 0 def a.foo end なんで定義できないんだよ!
実装上の仕様で、Integer オブジェクトは即値だから。
なんで定義したいんだよ
>>100 即値なのはFixnum。
でも、即値だから定義できないのだっけ?
一時期できていたのを、意図的にやめた気がします。
>>98 妙に納得。純粋にライブラリとして使っている
アプリ側から見たら、確かに。
何でそうじゃないんだろ
ふつー寿命が同じだからでしょ
フロントエンドである「ruby」から使うことが最優先だから、 ライブラリとしての完成度を高めるための余分な手間を かけたくない、ってことでよろしい?
>>95 これはどうしてエラーになるの?
初心者でスマソ。
>>105 というよりも、その部分に手間をかけたい人が今のところいないってことかと。
ruby-dev にご参加ください。
>>107 なるほど。自分はぜんぜん詳しくないけど、そういう話題が
ふさわしい時期、たぶん1.9か2.0の開発が始まる頃までに
そういう問題提起をできるまでのスキルになりたいっす。
かんばりまふ。(devは見てますよ、いちお)
馬具?
>>106 ブロックがイテレータとして扱われるからでは。
>>106 def q() puts yield end
for line in <<EOS do eval(line) end
q { "helo, world" }
q { 1 <= 2 }
q { 1 => 2 }
EOS
Rubyの+や-や*や/などってメソッドだそうですが、 a = 3 + 5 * 7; p a の結果が、3の+メソッドに5を渡した返り値8。 返り値8の*メソッドに7を渡した返り値56がaにあると考えるのが、 メソッドだとすると普通だと思うのですが、結果は38です。 いったいこれのどこがメソッドなのでしょうか?
114 :
デフォルトの名無しさん :03/07/12 23:03
>>113 マニュアルにある理由じゃない?
>プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形式をとります。
一応、実行される順番が文法で普通でなくてもIntegerのインスタンスメソッドを呼び出しているのですよね。 電子の妖精さんが、実行順序を算数の普通に変更してくださってると、理解しときます。 それはさておき、 Fixnumは即値であるという表現がされていますが、 そのオブジェクト自身の値を変えられないのは即値であるという理由からなのでしょうか? Bignumは即値でないそうですが、「i++」のように、値を変えても問題ないのではないでしょうか?
>>115 数値を変えられないのは仕様だろう。mutableな数値はなかなか奇抜な発想では?
num0 == num1 ならば num0.id == num1.id が成り立って欲しいくらいだが、
それだと効率が悪いからFixnum以外はそこまではしないのだと思われ。
だからFixnumが即値なのは理由というより単に実現方法じゃないかな。
即値それ自体は言語仕様には関係のない用語だと思う。
Ruby/Gtkで、CListにappendしたデータを取得する方法ってないの? Ruby/Gtkプログラミング入門の書籍を見てんだけど載ってない。 これは、自分で管理した方がいいということかな。
>>117 children かなんかで取れなかったっけ?
確か、はるか上のクラスで定義されてるんだよ。
children だと空の配列しか返ってこなくて rbbr.rb でいろいろ調べてたら分かりました。 get_text(row,column) で取得可能でした。
>>117 CListはobsoleteなんで、これからやるなら
Ruby/GTK2のTreeView周りもよろしく。
一応書いとくけど、
語るスレ3 の
>>619 の
> しかし文字列もそうなんだけど、Cプログラマのmatzには
> 文字列の数学的性質に馴染みがなかったから string を
> mutable にしたんだろう。
は少し的外れじゃなかろうか。
一言で言えば「Perlに合わせた」んじゃ。
つまりは、よく使われる文字列処理においては
(特にFixnumと比べて)オブジェクトの生成による性能低下が
顕著になるから、ということではないでしょうか。
ご存知の方が多いでしょうけど、
PythonやJavaにおける普通のstringはimmutableです。
思想の違い以外にも、想定用途の違いもあると思う。
微妙に文字列の話にそれるけど、要はこういうことね
S = 'hoo'
S.gsub!('o', 'e')
p S
# => "hee"
Sが指すのは「文字列『変数』」で、
Stringは「文字列を『保持する』クラス」であるっつー事にもなる。
この理由は
>>122 と推測。
Integerでこれができると「整数を保持するクラス」になって、
「整数クラス」にならない。これが分かりづらいって話じゃないでしょうか。
演算子の優先順位の表をにらめっこしながら括弧付けてけばわかりやすいかと。 a = 3.+(5.*(7)); p a
>>122 text processings に重きをおくPerlの経験に習ったのも理由の一つだろうね。
しかし元の文脈は Integer が immutable で String が mutable であることを
説明するであって、Integer には数学的対象としての性格を求め、
String には求めなかったというのもそれ自体は間違っちゃいないと思う。
equal? が identical? という名前だったら意味が分かりやすかったろう。 equal? と == の意味が異なるのは英語として分かりにくい。
128 :
デフォルトの名無しさん :03/07/13 17:23
[a,b,[c,[d,e]]]という配列を "a,b,\"c,\\\"d,e\\\"\""という文字列で表したいのだが 良い方法はないだろうか? 逆は def csv_spl(str) buf = (str + ',').scan(/"([^"\\]*(?:\\.[^"\\]*)*)",|([^,]*),/).collect{|x,y| y || x.gsub(/\\(.)/, '\1')} buf2 = [] if buf == [str] str else buf.each do |c| buf2.push(csv_spl(c)) end buf2 end end でできるんだけどね(^^;
>>128 押してもだめなら引いてみよう。
puts [1,2,[3,[4,5]]].inspect.gsub(/\[|\]/, "\"")
# => "1, 2, "3, "4, 5"""
>>127 ナイスだとおもいます。
1.9/2.0に向けてなら、提案の価値があると思います。
>>128 仕様がいまいち分からんがこういうことか?
def foo(ary, depth = 0)
c = depth.zero? ? '' : "\\"*(depth-1) + '"'
c + ary.map{|i| i.is_a?(Array) ? spl_csv(i,depth+1) : i.to_s }.join(",") + c
end
p foo([1,2,[3,[4,5]]]) #=> "1,2,\"3,\\\"4,5\\\"\""
equal?は何でequalなんだろう。 英語のequalにidenticalの意味ってあるんだっけ? 手元に英英辞書がないから分からん。
出直してきました。
def foo(a)
n=0
t=''
s=a.inspect.delete(' ')
s.each_byte do|c|
case c.chr
when '[', ']'
t<<(n==1?'"':n==2?'\"':'')
n+=(c.chr=='[')?1:-1
else
t<<c.chr
end
end
t
end
p foo([1,2,[3,[4,5]]])
#=> "1,2,\"3,\\\"4,5\\\"\""
でも
>>133 氏の前に完敗です。
>>134 Webは手元にあるはずです。
ttp://www.m-w.com/ によれば、
1 a (1) : of the same measure, quantity, amount, or number as another
(2) : identical in mathematical value or logical denotation : EQUIVALENT
(snip)
とあります。他の部分にidenticalという単語は見当たらず。
「理論的・数学的にidentical」なのがequalなのでしょう。
Object=ものとしての同一性ならやっぱり、
identical? じゃないでしょうか。
すこしでも速いrubyスクリプトの書き方についてまとめたページってある? むかしはloveruby.netにあったような覚えがあるんだが。
>130 うちの環境だと 3:in `foo': undefined method `spl_csv' for #<Object:0x2859618> (NameError) っておこられるのだが、spl_csvってどっかの拡張メゾットか?
>139の1行目は>133 の誤りです
>>138 さんきゅう
最適化という言葉が浮かばなかった
>>141 どんまい。漏れもそういう時あるよ。…(自然・人工問わず)言語って難しい
xmlscan の上野さんが高速化のコツみたいなんをどっかで書いてたような。 ぐぐってみたけど見つからんかった。
>>139 >133は再帰のつもりだった。spl_csv を foo に書き換えて。
ruby遅いで
何をいまさら。。。
速くする話って雑誌の記事でもなんかあったような
遅くする話もしませんか
可能な限り破壊的メソッドは使わずにオブジェクトは毎回作る
ローカルでない変数の更新はすべてマルチスレッドセーフにする。
Ruby 自体がスレッドセーフにならなきゃ安心して Ruby を組み込めねーよ! というひとの数 →
スレッドセーフになったとしても安心しては組み込めないな。
>>148 C的に書く。
例:文字列の操作
× str = str.sub(/a/, 'A')
○ cc = 'a'; str.split(//).each {|c| if c == cc then cc = nil; 'A' else c; end}.join
>>153 str = "banana"
tmp = str.dup;
for i in 0..(str.size-1)
if (str[i] == ?a) then
tmp[i] = ?A;
break;
end;
end;
str = tmp;
printf("%s\n", str);
>>153 すくなくともRubyではこう
× str.split(//).each { ...
○ str.scan(/./).each { ...
手元では、
i686-linux な CVS HEAD では 13%
i686-cygwin な preview3 では 72%
scanの方が速い
jcodeのString#each_charでもそうしてたはず
# CVS HEADのバイナリはデバッグ用に-O0なため
# 一般的なUnix系での実際の数値はcygwinの物に近いはず
>>155 > scanの方が速い
ならsplitを使うべきなのでは?
アウチ
正規表現自体の最適化について参考になるページってありませんか?
161 :
デフォルトの名無しさん :03/07/15 07:16
商用向けソフトで組み込みスクリプトとして使いたいので、 ライセンス的に不都合が無いか調べています。 LICENSE.txtの第3項で質問があるのですが、 > (a) バイナリを受け取った人がソースを入手できるように, > ソースの入手法を明示する. これは、組み込んだソフト全体のソースコードを公開せよ、ということですよね。 > (b) 機械可読なソースコードを添付する. これは、どういうことなのでしょうか? 結局はコンパイル可能なソースコードを付けろ、ということですか? 自分の解釈では、商用向けには向かないと考えていますが、 実際のところどうなのでしょうか
>>161 作者にメール!
そういうのは、後の人のためにもメーリングリストで聞くべきでは?
>>161 > LICENSE.txtの第3項で質問があるのですが、
LICENSE.txtじゃなくてCOPYING.ja?
3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ
ルしたオブジェクトコードや実行形式でも配布できます.
本プログラムってのはRubyのことだから当然Rubyのソース。
> 自分の解釈では、商用向けには向かないと考えていますが、
> 実際のところどうなのでしょうか
Ruby's Licenseは商用でも問題はないはず。
実際アプリケーション組込み用途に使ってるのは何人かいる。
# なぜか海外が多いような。
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
商用、つーか独占的(ソース秘密主義)ソフトウェアね。
3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ
ルしたオブジェクトコードや実行形式でも配布できます.
の
(a) バイナリを受け取った人がソースを入手できるように,
ソースの入手法を明示する.
(b) 機械可読なソースコードを添付する.
は呑めないのだろうけど
(c) 変更を行ったバイナリは名前を変更したうえ,オリジナ
ルのソースコードの入手法を明示する.
でOKになるのでは。
ここの「オリジナルのソースコード」がruby-1.6.8.tar.gzなりなんなりに
なるのだろうから、
「XXはRubyを組み込んでます。Ruby1.6.8はこちらから入手できます。」
と書けば平気なんじゃなかろうか。という素人の考察。
最も、GNUがオリジナルArtisticライセンスを「非フリーウェアライセンス」
とする理由は「あまりにも曖昧過ぎる」「意味も不明瞭」という点にあるから、
Artistic-likeといわれるRubyのCOPYING.jaの意味をruby-listで
明確にするのも、悪い選択じゃない気がする。
ttp://www.gnu.org/licenses/license-list.ja.html#ArtisticLicense (現状のRubyライセンスがGPLとのデュアルである理由の一つも、
COPYING.jaのみではGNU的には非フリーウェア⇒非GPLコンパチだから、だそうで。)
あ、ちゃんと過去ログ読んでからにしろよ。
と、書いた後だけど、3.(c)の「オリジナル」という単語は 本当に「改変前のオリジナルRuby」という係り方なのだろうか。 original=「原型の」だからひょっとしたら、 「バイナリに対する原型のソースコード」 ってことになったり。 んーよく分からんっす…
>>168 以前のruby-listでの議論は不毛だったので、
>あ、ちゃんと過去ログ読んでからにしろよ。
読まなくていいです。
そういえば、Rubyを組み込んだゲームって話題があったけどどうなったのかな?
rubyのソースを添付するか入手方法さえ書いておけば 商用ソフトに使うのはなんら問題ないでしょ。
MLでライセンスを話題にするとるびべん(aka ○zakit)が しゃしゃり出てきてうざくなる罠。
>>172 しゃしゃり出てきたところでそのままMorpyOne関係者に引き渡そう。
みなさん、いろいろ教えてくれてありがとう。 > 3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ > ルしたオブジェクトコードや実行形式でも配布できます. *いずれか* なんですね。すっかり、見落としていました。 今回の場合は、(c)のケースで問題なく使えそうです。 自分はクローズドソースにするつもりはなくても、 そうせざるを得ない場合がほとんどなのです。 そんなわけで、こういうライセンスは非常に助かります。
>>70 >>74 はおそらくあってると思う。
一番の解決策は、非LGPLな正規表現ライブラリである
鬼車(onig...)をregex.[ch]の代わりに使うこと。
FTPのcontrib以下にもあるし、CVSで取って来てもいい。
将来のRubyでは標準で使われる予定のものなので、
すぐにregex.[ch]から乗り換えられるように
現状のRubyとのすり合わせも行われてるっぽいし、
ライセンス問題の解決策としては一番妥当かと。
普段使ってるのはonigurumaでコンパイルしてある。 たまーに既存のと動作が微妙に違うことがあるが。
from scratch だから、まあそういう時もあるよね。 物にもよるだろうけど、過去に議論されてなくてかつ 影響がそこそこありそうなどの場合、 良い子はMLかkosako氏にメールしませう。
>>176 あるいは、regex.[ch]を単独の共有ライブラリに分けるとか。
つーかlibrubyごとアプリケーションから分離しておけば、
LGPLには影響されないんじゃないか?
ところで、もしかして小迫タンって女性?
>>179 そっかそっか、ていうか基本的なとこ忘れてたよ。
「L」GPLじゃん。てことはlibrubyがLGPLの下に置かれたバイナリと
しても、プロプライエタリ(商用)ソフト側と別バイナリにして
librubyをリンクだけする形にすれば、プロプライエタリ側のソースは
LGPLにはなんら影響されない、ってことだよね。
ソースレベルで直にregex.[ch]を丸呑みしなければいいだけの話か。
# 勘違いしてたら突っ込んでくれ、だれか…
女っ気のないMLだな。
Ruby ちゃんがいます。 みんなにいじくり回されてます。
Mac OSXでirbを使うと カーソルキーを押したときに^[[A ^[[B ^[[C ^[[Dと表示されてしまい うまくつかえません。 また、Ctrl+Pなども^Pと表示されてしまいます。 もちろん、他のviやシェルやemacsなどでは正常にカーソルキーも コントールキーも使えます。 Terminal,JTerminal + bash,tcsh,zshなどの組み合わせも試しましたが 全部ダメでした。 どなたか解決方法ご存じの方いらっしゃらないでしょうか? irb 0.7.4 ruby 1.6.7
>>187 readline.soが無かったので、
finkのOSXデフォルトじゃないrubyを落としてきたところ
finkのrubyのほうもreadline.soは無かったのですが、
正常に動作するようになりました。
どうもありがとうございます。
あおきさんみたいにリッチに買い物したいなぁ、、、
よーし、Opteronで一台組んじゃうぞー。
191 :
デフォルトの名無しさん :03/07/19 01:41
\x95\x5c\x94\x5c みたいな文字列を日本語に変換するにはどうすればいいのでしょうか?
エヴァれ
もうちょっと詳しく教えて頂けないでしょうか? evalでやろうにもやり方の見当が・・・
>>191 こんなんじゃダメ?
require 'uri'
$KCODE = 's'
str = '\x95\x5c\x94\x5c'
p URI.decode(str.gsub(/\\x/, '%'))
こんなんどうか str = '\x95\x5c\x94\5c' puts str.scan(/[0-9A-Fa-f]+/).collect{|x| x.hex}.pack('C*')
195氏の方が3倍以上早いな。 やっぱり、初心者の考え付くことはこの程度だな(w
src = "\\x95\\x5c\\x94\\x5c" ; dst = eval("%(#{str})")
>>196 3倍は違わんでしょ
1.8で10**6回ずつ実行させてtimeで計ると eval:pack:decode=1:2:4.6 ってとこだった
time ruby -ruri -Kse 's="\\x95\\x5c\\x94\\x5c"; 1000000.times{eval("%(#{s})")}'
time ruby -ruri -Kse 's="\\x95\\x5c\\x94\\x5c"; 1000000.times{s.scan(/[0-9A-Fa-f]+/).collect{|x| x.hex}.pack("C*")}'
time ruby -ruri -Kse 's="\\x95\\x5c\\x94\\x5c"; 1000000.times{URI.decode(s.gsub(/\\x/,"%"))}'
>>198 そうでつか。わざわざベンチありがとう。
-ruri ハァハァ
oriライブラリを作るべきだな
みなさん、どうもありがとうございます。 やり方一つとっても何通りもあるんですね。 非常に参考になりました。
require すると結構時間かかるよね。
>>203 いったいいつのマシンを使ってるんだ。
あ、もしかして require の後に毎回 GC するせいかな?
1.8 を使うか、ファイルの数を減らしてみたらどうよ。
1.8 でも bison を使ってビルドしないと GC の回数は
減らないけどね。
みねたん
Riteで継続は
みねたんハァハァ。。
211 :
デフォルトの名無しさん :03/07/20 22:37
なぁなぁ、 文字列をUTF8にエンコするのに、何使えばいい? uconvのcygwinバイナリ捜したんだけど、なくってさ。
212 :
無料動画直リン :03/07/20 22:38
>>213 makeの途中で止まっちまうんすよ。
バイナリないっすかね。
もしくはPure Ruby なモヂュール。
ruby 1.6.5 (2001-09-19) [i386-cygwin]
でつ。
>>214 roughのunkfもmake出来ない?
>>215 CVSwebの使い方がワカラン・・・
すまん。
とおもったらzipがあった。 やってみす。
$ make
gcc -DUSEIMPORTLIB -Os -DRB16 -DUTF8_SUPPORT -DUSE_JUDGE_JCODE -I/usr/local/li
b/ruby/1.6/i386-cygwin -I. -I/usr/local/cygwin-local/include -I/usr/local/cyg
win-local/include -c -o unkf.o unkf.c
dllwrap --target=cygwin --as=as --dlltool-name=dlltool --driver-name=gcc --expor
t-all -s --def=unkf.def -L/usr/local/cygwin-local/lib -L/usr/local/lib -o unkf.
so unkf.o -L. -lcygwin-ruby16
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/../../../../i686-pc-cygwin/bin/ld: cann
ot find -lcygwin-ruby16
collect2: ld returned 1 exit status
dllwrap: gcc exited with status 1
make: *** [unkf.so] Error 1
ぐは。
-lcygwin-ruby16てなんですか?
>>217 やってみます。
ActiveScriptRubyでそのまま使えるruby-sumoのパッケージって存在しますか?
222 :
デフォルトの名無しさん :03/07/21 16:30
少しrubyからはなれているのですが。。 str = Uconv.euctou8("夏目 漱石") print str とすると、"紊 羲援"こんな感じに文字化けします。XML文書中に 含ませるためにはどのような処理をしなければならないのでしょうか。 御面倒ですが、アドバイスをお願い致します。
出力をどうやって見てるの? print str の結果を、(utf-8 を理解しない)端末にたれ流してるんだったら、 そんな風に見えるのが当たり前のような。
224 :
デフォルトの名無しさん :03/07/21 16:51
全くオッペケペ
226 :
デフォルトの名無しさん :03/07/21 21:12
>>225 ですよね(^^;
自分としては、下の例での「E4B887」がほしいんです。
「万」==>unicode:4E07
「万」==>utf-8:E4B887
----
str1 = "万"
str2 = Uconv.euctou8(str1)
print str2 <-これじゃダメです。
227 :
デフォルトの名無しさん :03/07/21 21:13
rubyで作った拡張ライブラリではないプログラムの インストーラは、何を使うべきですか?
日本語が意味不明だったので訂正します。 rubyで書いたスクリプトのインストールには、どのような インストール方法を用いるのが一般的でしょうか?
>>226 だからあ、表示できないのは端末の問題でしょ。
何が欲しいのか分からんが、下を実行して出来る foo.html を mozilla か IE で見れ。
require "uconv"
str1 = "\260\354\275\275\311\264\300\351\313\374"
str2 = Uconv.euctou8(str1)
open("foo.html", "wb").print(<<EOS)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>utf-8</title>
</head>
<body>
<h1>#{str2}</h1>
<p>#{str2.unpack("H*")[0]}</p>
</body></html>
EOS
>>229 一般的かどうか知らんが
漏れはふつーに autoconf/automake でつ
>>229 標準となってるような方法は *ない*
一般的なのは
*
>>231 みたいに autoconf/automake
* 自作スクリプト
* 手でコピってね ♥
など……だと思うけど、もしかしたら install.rb / setup.rb がよく使われ
てるのかもしんない。ぐぐってみて。
233 :
デフォルトの名無しさん :03/07/21 23:20
>>230 ありがとうございます。
欲しかったのは、string.unpack("H*")です。
「16進文字列でアンパックした要素の列」(google)ということだったのかな?
予想外のオチ。
stdout, stderr を /dev/null に吐かせつつ popen するにはどうしたらいいのでしょうか?
>>235 質問の意味がよくわからないのですが、 Open3 が参考になりますか?
237 :
デフォルトの名無しさん :03/07/23 02:53
正規表現で質問です。以下の式はどういうことを表現していますか? /^Giko:/i
>>235 command > /dev/nullでいいと思いますが。
stderrもか・・・
241 :
デフォルトの名無しさん :03/07/23 05:34
>>237 giko:
gikO:
giKo:
giKO:
gIko:
gIkO:
gIKo:
gIKO:
Giko:
GikO:
GiKo:
GiKO:
GIko:
GIkO:
GIKo:
GIKO:
>>236 open3 は見てもよく分かりませんでした。
>>239 ありゃ、そんな単純なので ok だったんですね。
stderr も捨てるのは >/dev/null 2>&1 でいけました。
みなさんありがとう。
WinXPでRubyを使っています。 コンソールで、文字の色を変えたり、同じ行を書き換えたりするにはどうすればいいでしょうか。 どなたかよろしくお願いします。
しまった、名前欄が・・・
>>196 氏とは関係ありません。
いや、「それはRubyの問題じゃない」という関係がある
>>246 すれ違いすいませんでした。
Rubyで試したらうまくいかなかったので、Rubyのせいにしてしまいました。
Cでもダメでした。じゃぁ、XPのコンソールが悪いのか。
適切なスレを探してみます。ご迷惑をおかけしました。
\windows\system32\config.nt に device=%SystemRoot%\system32\ansi.sys dosonly を追加したらANSIのエスケープシーケンスが使えるんでない?
>>249 残念ながら解決できませんでした。
スレ違いなのにレスをありがとうございました。
Mingwと一緒にインストールしたMSYSのことをすっかり忘れていました。 MSYSのrxvt上で実行することで、エスケープシーケンスが解釈されました。 お騒がせしました。
ようやくpreview4。
いろいろと押してるからshimまで手が回らない。
これでバグが見つかなかったら正式リリースだね。
ruby-1.8.0-preview4
http://www.ruby-lang.org/ja/20030724.html ちょっとメモ
= 1.6.8 -> 1.8.0 追加されたバンドルライブラリ
== lib 配下
・benchmark : ベンチマーク
・csv : CSV データのパースと生成
・date::format : 日付<->文字列変換ユーティリティ
・drb : 分散Ruby
・erb : Tiny eRuby プロセッサ
・fileutils : ファイル操作ユーティリティ
・ipaddr : IP アドレス操作の低レベル API
・open-uri : net/http と net/ftp を簡単に使うためのラッパ
・pathname : オブジェクト指向なパス名操作
・pp / prettyprint : preetty printer と pretty print ライブラリ
・profiler : profile をライブラリ化したもの
・racc : コンパイラコンパイラ
・rexml : XML parser
・rubyunit / runit: unit/test による RubyUnit 互換ライブラリ
・scanf : scanf(3) の Ruby 実装
・set : 集合(コレクション API)
・unit::test : ユニットテスト
・tmpdir : tmpfile のディレクトリ版
・webrick : Web サーバフレームワーク
・xmlrpc : XML-RPC API
・yaml : yaml 文書の操作
lib/README が更新されてないね。 == ext 配下 ・bigdecimal : 任意桁数の小数点演算 ・dl : ダイナミックリンカへのインタフェース ・iconv : I18N 文字列変換 ・io/wait : ノンブロックな wait ・openssl : openssl ラッパ ・stringio : IO みたいに使える String ・strscan : 高速文字列スキャナ ・syck : YAML 読み書きライブラリのラッパ yaml で使用 ・zlib : zlib を使った gzip データ操作
255 は全然嘘だった。ちゃんと dev を読めと。 7/28 preview5 → preview6 ? → 7/30-/7/31 正式リリース予定? 今月中にリリースするつもりなのかな?
さらにメモ。
RubyForge
http://rubyforge.org/ 定点観測
総計 8 プロジェクト
・Vapor : JDO をモデルとした PostgreSQL 向けの persistent Object-Repository ライブラリ
・Ruby VGA-Planets Viewer : VGA-Planets というゲーム用のデータビューアらしい
・Ruby Muravey Tools : Ruby ベースでウェブサイト構築するためのキット。まだリリースなし。
・RMagick : ImageMagick へのインタフェイス。便利。
・rGenetic : 遺伝的アルゴリズムを使ったプログラムを作るためのフレームワーク。リリースなし。
・AEditor : ペアプロ用エディタウィジェット。ncursesやQtで使えるようだ。
・Vim/Ruby Configuration Files : vim 用の設定ファイル
・Ruby Live Journal :
http://www.livejournal.com/ のクライアント。リリースなし。
>>255 ruby-dev見始めたの最近なのでサンクス。
xmlparser 入って欲しいなぁ。
最近 Smalltalk をやって、 Ruby ならではの機能と思っていたものの多くが Smalltalk のパクリなのに気づいて こんなんだったら最初から Smalltalk やっときゃよかった という気持ちでいっぱい。
前から Perl の見た目の Smalltalk と呼ばれてたじゃん。
>>257 Mac OS Xの次バージョンに入る〆切らしい。
>>263 Appleに感謝したいな。
そういう外圧的〆切がなければ、まだまだ当分リリースされなかったに
違いない。
昔のC magazineを図書館で見つけたのでちょっと見てみたら、 Javaに関してequalsはidenticalならばよかったのに、と触れてあるコラムがあった。 やっぱりそういうことを考える人は多いんだろうか。
hash = Hash.new([]) (1..16).each do |i| hash[i].push i end p hash #=> {1 => [1], 2 => [2], ..., 16 => [16]} だったら嬉しいのですが(ver1.6)。 v1.8ではどうなってますか?
しかし、単にpushしただけだとそのまま捨てられてしまう罠。 hash = Hash.new {[]} (1..16).each do |i| hash[i] <<= i end または hash = Hash.new {|h,k|h[k]=[]} (1..16).each do |i| hash[i].push i end 後者は、存在しないキーにアクセスしただけで追加されてしまうという、 副作用があるけど。
imlib2-rubyでマルチバイトの文字を描画するって できるんですかね?
"_x\n_x1,1_x,_x,_x_x:_x\n_x" の中にある _x をRubyのローカル変数名と みなして "(_x)\n_x1,1_x,(_x),_x_x:(_x)\n(_x)" に置換する方法を教えてください。 ただし、文字列全体を置き換えるのは、なしです。
>>270 置換された結果として何を望んでいるのかが分からない。
その方法を foo(str) として
_x = "X"
str = "_x\n_x1,1_x,_x,_x_x:_x\n_x"
p foo(str)
の出力には何を期待しているのか?
>>270 こゆこと?
"_x\n_x1,1_x,_x,_x_x:_x\n_x".gsub(/\b(_x)\b/) { "(#{$1})" }
273 :
デフォルトの名無しさん :03/07/28 05:04
正規表現の後ろにmが付いているのは何か意味あるんですか?
>>273 それは正規表現のオプションで、複数行モードで処理しろってこと。
複数行モードだと正規表現のピリオド(".")が改行にもマッチするようになる。
/.+/は一行にマッチする
/.+/は全行にマッチする
例:
p /.+/.match( <<EOS ).to_s
line 1
line 2
line 3
EOS
p /.+/m.match( <<EOS ).to_s
line 1
line 2
line 3
EOS
275 :
デフォルトの名無しさん :03/07/28 05:59
/.+/は全行にマッチする は /.+/mは全行にマッチする ですよね。
>>272 それで置換できるのかー。
Emacs の replace-regexp で \b\(_x\)\b を (\1) に
置換するとなぜか "_x\n_x1,1(_x),_x,_x(_x):_x\n(_x)" に
なってしまって、Rubyも同じだと思ってた。
>>277 自己レスですがEmacsは構文テーブルに左右される
ようだからRubyと同じには、ならないですね。
279 :
デフォルトの名無しさん :03/07/28 17:39
preview5 出た。
Array#sortって安定じゃないよね。 ぐぐった程度ではみつからなかったんだが 安定なsortってない?
自分で書いて Array に定義すれ。
それしたヤシいたら楽できるかと思ったが。 やっぱ書くか。 つか、rubyのmlで3年前に話がでてるが結局だれも しなかったのな。
>>280 1.6 なら大人しく Schwartzian Transform しとけ。
class Array def sort_stable!(&b) each_with_index{|x| self[x.last] = x} sort!(&b) && each_with_index{|e,i| self[i] = e.first} end def sort_stable(&b) a = dup a.sort_stable!(&b) a end end a = %w(a b a b a) u, s = a.sort, a.sort_stable for i in [a, s, u] p [i, i.map{|i| i.id}] end
今使ってるのは1.6.7だけど、 下のコードは最新だとエラーなしで通る? def a; *(0..2); end; p a #=> parse error
>>287 % ruby -ve '
> def a
> *(0..2)
> end
> p a
> '
ruby 1.8.0 (2003-07-29) [i686-linux]
-e:3: parse error
-e:6: parse error
>>287 それはどう動く (動いて欲しい) コードなの?
>>288 def a
(0..2).to_a
end
p a #=> [0, 1, 2]
こういうことか?
Schwartzian Transform したからといって stable になるわけじゃあるまい?
> Enumerable#sort のソートアルゴリズムは安定(stable) ではありませんが(比 > 較結果が同じ要素に対して、元の順序を保持しないことを「安定ではない」と > 言います)、sort_by を使って以下のようにすることで stable sort を実現で > きます。 > > i = 0 > ary.sort_by {|v| [v, i += 1]}
>>288 なんだ、ダメじゃん。
まぁ、何かの理由で *(0..2) という表記は戻り値として使えないから
>>290 のように to_a にしとけということかな。
とはいえ、下のように return を付けるとエラーにならないのが謎。
def a; return *(0..2); end; p a #=> [0,1,2]
$ ruby -ve '*(0..2)' ruby 1.8.0 (2003-07-28) [i386-cygwin] -e:1: syntax error
>>293 引数とそうでないものは違う。
$ ruby -ce 'foo a,b'
Syntax OK
$ ruby -ce 'a,b'
-e:1: parse error
>>293 で、それがエラーになると何かまずいことでもあるの?
ていうか *(0..2) って何
returnを特殊な構文のように考えていたけど、 普通にreturnの「引数」だから *(0..2) と書けるわけか。
>>291 ようするに286みたいにeach_with_indexと併用ってことじゃない?
ふつーの MSYS でふつーに mingw 版を作ろうとすると、 openssl_missing.c でエラーになるなあ (1.8.0 preview5)。 OpenSSL 入れろってこと?
>>302 おお、情報サンクス。対応早いですね。
MSYS 1.0.9 からは rxvt 上で普通にビルドできるようになってウレスイ。
304 :
デフォルトの名無しさん :03/07/31 11:23
#!/usr/bin/ruby str='表' if str =~ /表/ then puts 'OK' end ↑これマッチしないの、なんでだろ〜?
文字コードが Shift_JIS && $KCODE を指定してないと見た
#!/usr/bin/ruby -Ks str='表' if str =~ /表/ then puts str end ごめんなさい
>>306 はうまくいくのですが、
#!/usr/bin/ruby
$KCODE='SJIS'
str='表'
if str =~ /表/ then
puts str
end
はだめです。どうしてですか?
>>307 リファレンスマニュアル FAQ 10.2 「オプション-K と $KCODE の違いはなんですか?」を参照。l
>>308 そのまんまの答えですね。
調べずに書き込みしてごめんなさい。
preview6 releaseされたようだ。
マジで8/1(遅くて8/4)に1.8.0出す気?
>>311 8/1にpreview7、8/4に正式リリース。
なんで Ruby って feature freeze とかしないの?
>>313 してる。matz日記参照。
ただ、freeze後もいくつか変更がはいった。
>>314 情報をよく集めているデベロッパだけfeature freezeされて、空気読まない連中は
feature freezeされない罠。
やっぱりリリースエンジニアリングが(ry
(^^)
BigDecimal使ってる奴、議論に参加してやれよ。 俺は使ったことないのでわからんが。
Windows上で、RubyでGUIを作ろうと思ったら何がいいんだろう? Ruby/tk? Apollo?
321 :
デフォルトの名無しさん :03/08/02 15:06
Ruby/GTK と Ruby/GTK2 は何が違うんだ?
Gtk1.xベースとGtk2.xベース。
FOXRuby
前から疑問に思ってたんだけど、 Ruby/GTK ↑ この単語間のスラッシュは何?
区切り
割り算
別居中
左側が右側にもたれかかってる
Rubyなれなれしいな
バトル!
Ruby☆GTK
withではなかろうか。 あたかもcall with current continuationがCall/CCになるように。
特異メソッドを使うかサブクラシングするかはスタイルの問題ですか? 両者にパフォーマンス等でトレードオフがあれば教えて下さい。
パフォーマンスを知りたいなら自分で計ってみるのが 一番納得する方法だよ。 なんでもかんでも人に聞いちゃいかんよ。
>>335 そーか。「×× with 〜」または「×× using 〜」とも解釈できるな。
あと、分数棒として読めば「×× over 〜」になる。
G/W とか H/W とかの / の意味がわからん。
I/F、I/O
左の人が右の人を棒で叩いてる図
ガッ/ヌルポ
ガッ bashes ヌルポ
んじゃRuby/Pythonとか
require "delegate" class C < SimpleDelegator def initialize super("A") end end Marshal.dump(C.new) > `dump': singleton can't be dumped (TypeError) なぜ?
>>345 dump して load したら dup したことになるからでは。
BigDecimalは unix板ぐらいでしかネタにされてないか。
そうでし
なんか、Ruby 関連スレはそれぞれうまくネタが住み分けされてるね。 スレタイや板とは無関係に。
とりあえず、祝リリース!
>>342 ヌルポ rescue ガッ
だろう。
358 :
デフォルトの名無しさん :03/08/05 01:10
1.8.0リリース記念age
359 :
デフォルトの名無しさん :03/08/05 09:56
if $_ =~ /(\:)(\d+)\:/ $_.sub!(/\:\d+\:/, "(#{$2}):") end をsub一回に書き換えられませんか? ifのチェックをしないとsubの行の$2に値がセットされません。
s.sub!(/(\:)(\d+)\:/, '(\2):')
$_.sub!(/\:(\d+)\:/) {"(#{$1}):"} じゃダメ?
Rubyをベンチしてるサイトどっかにない? なにか表現がおかしいけど気にしない。
363 :
デフォルトの名無しさん :03/08/05 17:47
>>357 irb.bat実行するとreadline.dllが無いって怒られるんですが、
何処から拾ってくるの?
365 :
デフォルトの名無しさん :03/08/05 19:25
>>364 肝心のdllがどこにも見当たらないんですが・・・
>>365 MinGW pre7 のやつ使ってるけど大丈夫ぽい
るびきちのirbshの本買って、本の通りにインストールしたけど NameError: uninitialized constant Irbsh とエラー出て まったく動作しませんが、何か?
369 :
デフォルトの名無しさん :03/08/05 19:54
スタックを増やす方法をおしえてください。
今cgiとしてRubyプログラムを走らせるとして クライアント(UNIX系OS)のディレクトリ構造をWEBに吐き出させようと したらどうしたらええでしょうか??
(゚Д゚)ハァ?
hoge.cgiに #!/usr/local/bin/ruby # 今このファイルを実行したクライアントのディレクトリ構造 # を出力する みたいな処理はできないのですか?という意味です。
puts `ls`
それは、サーバ上のディレクトリしかわからんと思います・・・ ’クライアントの’が表示したいのです。
クライアントからディレクトリ構造を送ってもらうcgiを作る。 というかね、サーバ側がどう頑張っても無理。
>>377 そういう大事なことは始めから書いた方がよい返事がもらえますよ。
このやりとりで、論点がすっきりしました。
クライアント/サーバを一から理解しろクズ! 氏ねや夏廚
380 :
デフォルトの名無しさん :03/08/05 22:21
スッタクを動的にどんどん増やしたいぞな。
理解した上で、できないかと思ったので・・・ クライアントでディレクトリ構造のデータを取得する Rubyプログラムを動かしておいて、サーバ側に送るってやるしか 無理なのかなぁ〜? ActiveXとかを使わないと駄目なのかな?
>>378 本当に無理なのか・・・?
できそうな気はするんだけど。
XML-RPC を使えば。
それでも、クライアントにWEBサーバいれとかないと駄目ではない? どっちにしてもサーバアプリかクライアントアプリをクライアント に常駐させておかないと、実現不可能ですかね。。。
>>377 クライアント側で情報垂れ流すI/Fがないと無理だと言ってるの。
それにRubyと全く関係ない。
httpクライアントがディレクトリリストをpostするだけだろ。 てかcgiにこだわる必要があるのか。単なるsockアプリじゃ駄目なのか。 セキュリティのことはちゃんと考えてるのか。
むしろ情報を抜く CGI が作りたいんでないの。
>>385 Rubyと全く関係ないというのはわかりますが、Rubyでプログラミング
したいと思ってこのスレに書き込みしました。
sockアプリでは駄目で、理由はそのsockアプリを配布して実行
しないといけないからです。
私が真にやりたいことは、ディレクトリリストを表示するだけでなくて
クライアントのあるディレクトリに目的のファイルがあるかどうか
までcgi側から調ることです。そのためには先ずディレクトリリスト
をクライアントから返すようなプログラムをcgi側から送れないか
と思ったのです。(cgiの構造はおおむね理解した上で)
セキュリティのことはこの際考えません。ActiveXのように、悪意
あるコードをクライアント側に流すような処理をするつもりは
ないです。
スレ違い+板違い。 ActiveX知ってるなら、それでやればいいじゃん。
>> 389 ActiveXは詳しくないのです。だから、それと似たような機能が Rubyでできればと。
>>389 ちなみに、クライアントはUNIX-OS対象なので、ActiveXでは
駄目なのです。
↑だから、その実現方法はRubyと全く関係ないでしょ? 多分ね、RubyだとCで拡張モジュール作るはめになるよ。 結論としてcgiとしては実現不可能。 ここで粘着しても無駄だから、Web板とか行って。
Ruby的にはクライアント側にdrbオブジェクト 仕込ませて待機させて遠隔操作するのがよし。
普通に実行プログラム配布してチェックさせればいいじゃん。
>>392 関係ないけど、Cで拡張モジュール作れても全然嬉しくないよな。
あつくなると、おおいですね。
まぁRubyがcgiへのディレクトリリスト送信ライブラリを備えていないのは不備と言えなくもないな。
>>397 cgiとかで公開できないじゃん。
環境依存だし。
400 :
デフォルトの名無しさん :03/08/05 23:38
Rubyはうんこ
>>302 Web板でも聞いてみます、不慣れな書き込みですいません。
Cで拡張モジュール…挑戦したい…具体的にはどのような
拡張モジュールにするべきでしょうか?
>>393 Ruby的にはdrb使うのが目的の処理ができそうですね。(WEBサーバ
仕込ませるのと似ているけれども、こちらのほうが軽く、速く
処理ができそう かつ しこませやすそう)
drbをつかった処理考えてみます。
つまりバックドア作りたいんだろ?そうなんだろ? MLで詳しく教えてやるよ。
>>402 バックドアじゃないけど・・・それに近いといえば近い。
今後
>>359 みたいな超 FAQ (sub, gsub で $1, $2, ... が参照できない) を防ぐにはどうすればいいですか?
sub(//, '') を廃止して sub(//) {} のみにするといいと思います。
>>406 冒頭の訳注内 「語感想」→「ご感想」
to_strの説明「新しいメソッドto_strが...として扱います。」→
「to_str()が定義されているオブジェクトを文字列とみなして取得するようになりました。」
>>406 訳注に突っ込んでも仕方ないが、
sprintfの"%p"フォーマットはinspect()による文字列化だぞ。
>>404 リファレンスのsub, gsubの項にサンプルコードと備考を追加するのがいいと思います。
1.8.0バグだらけじゃん。 あれだけpreview出しておきながら何やってんだか。 メンテナンスリリースとは言わず、さっさと1.8.1きぼん
このコードはヤバイ、 んまぁぁぁぁああああ!! まぎゅぃぃいいぬぇえぇぃいいいいいいいいいいいいい!! しんにゅうするつぼりゅえでえああああさあぁぁあぁぁぁああああ!!!
スラドに垂れ込む香具師はいないのか。 まあ、叩かれるのは目に見えてるが。
>>406 String/Array methods
Returns an instance of receivers class.
レシーバであるインスタンスのクラスを返します。〔訳注:???〕
→
レシーバのクラスのインスタンスを返します。
recievers は reciever's の typo かな?
破壊的メソッドも self を返すという意味だと思うけど違うかな?
>>414 「サブクラスのインスタンスのメソッド呼んだら、そのサブクラスのインスタ
ンスが返ってくる」みたいにも取れるかも。
1.8.0って1.6.8より処理おそくなってない?
>>416 まずは profile とってボトルネック調べれ。
www.cygwin.com/setup.exeのrubyはいつ1.8になるの?
そうかRuby減速か。ニヤリ
質問してもいいですか? 複数のスレッド間でオブジェクトを共有したいのですが、どうすれば共有できますか?
"foo bar".split / / が構文エラーで上手く行かない。 rx = Regex.new " " "foo bar".split rx の意味で動いてくれるとうれしいんだが。
424 :
デフォルトの名無しさん :03/08/06 22:21
web用途でphpに対するアドバンテージって何かあるの?
425 :
デフォルトの名無しさん :03/08/06 22:53
1.8では正規表現の \zと\Zが同じ意味になった気がするんですが、 片方しかマッチしない例とか教えてください。
/(.*?)\z/m =~ "a\n" p $1 # => "a\n" /(.*?)\Z/m =~ "a\n" p $1 # => "a"
>>426 ばかだったもっと簡単に考えなイカン
p /a\z/ =~ "a\n" # => nil
p /a\Z/ =~ "a\n" # => 0
>>426 どうも、ありがとうございます。
でも、mオプションが出てきて、なんか余計ややこしくなってきた。。
結局、1.6と1.8で $ , \Z が どう変わったのか、
わかりやすく教えてもらえないでしょうか?
>>429 >
>>426 > どうも、ありがとうございます。
> でも、mオプションが出てきて、なんか余計ややこしくなってきた。。
>
> 結局、1.6と1.8で $ , \Z が どう変わったのか、
> わかりやすく教えてもらえないでしょうか?
p "\n".gsub(/\z/, "o")
p "\n".gsub(/\Z/, "o")
ruby 1.6.8 (2002-12-24) [i586-linux]
"\no"
"o\n"
ruby 1.8.0 (2003-08-04) [i586-linux]
"\no"
"o\no"
というように、\Z が改行の前と文字列末尾の両方にマッチします。
$ も同じ。perl も同じ。
\z は文字列末尾にしかマッチしません。
文字列末尾に改行がなければ同じです。
>>431 とてもよくわかりました。
ありがとうございました。
全くの初心者なんで、おかしなこと言ってるかもしれませんが
1.6から1.8での
>>431 に書いてあるような変更って
$の方は理解できますが、\Z の方は、なんか変な感じですね。
"\nが文末にあると、もう一行増えたと考えることにした。"
ということなら、$の変更は理解できます。
しかし、最後に改行がある時、\Zが2箇所でマッチするように変更されたのは、
なんか気持ちわるいですね。
\Zを文末と捉えてはいけなくなった気がします。
本当に特別な表現になったような気がします。
みなさんは、どう思いますか?
>>424 使うのが数値、文字列、配列、ハッシュぐらいなら、PHPと比べて
特にうれしいということはないだろう。
Rubyを使ってうれしくなるのは、オブジェクト指向をバリバリ
使うとき。自分でクラスをバシバシ定義するようなプログラムだと
Rubyはとってもうれしい。
フロントエンドはあまり難しいことしないからPHPでもいいけど、
バックエンドで複雑なビジネスロジックを作り込む場合は、
どうしてもクラスを定義することが多いから、Rubyのほうが楽。
そうなると、フロントエンド側もRubyで揃えたくなる。
おいらはそれで全部Rubyにした。
>>433 で書いた
"\nが文末にあると、もう一行増えたと考えることにした。"
これ、おかしいですね。
^が増えた行頭にマッチしませんね。
失礼しました。
1.6の方がわかりやすいな。
まあ、Perlとかに合わせたってことで、歓迎すべきなんでしょうが。。
visualurubyをちゃんと1.8に対応させてホスィ exerbの1.8.0コアも欲しー
るびーおっそーい!
class C def var=(var) @var = var end def var @var end end ↑これを簡単に書くための attr_accessor はあるのに、 class C def self.var=(var) @var = var end def self.var @var end end ↑これを簡単に書くための attr_accessor がないのはなぜ?
>>439 > ↑これを簡単に書くための attr_accessor がないのはなぜ?
いらないから。
どうしても attr_accessor で定義したいなら
class C
class <<C
attr_accessor :var
end
end
とか
rubyのソースはインデントがナイト激しく見づらい!
インデントされてるじゃん、と思ったら navi2ch で見てるからか。
大丈夫Pythonよりは読める
>>441 インデントなしでも見やすい言語ってあるんか?
Prolog とか?
N88BASIC
それはインデントあっても見づらい言語。
本でないの?
>>445 もちろん本物のプログラマが使うFORTRAN
COBOLは?
Cは別にインデントいらないなあ。 目が慣れてるというのもあるが。
>>422 "foo bar".split(/ /)
455 :
デフォルトの名無しさん :03/08/07 22:48
Windowsで日本語のGUIアプリ作りたいのですが、RubyにはどんなGUIのツールキットがありますか?
456 :
デフォルトの名無しさん :03/08/07 23:08
WinでGUIアプリでしかも日本語? そりゃ向いてないよ。 RubyはUNIXで使いましょう。
Apollo, VisualuRuby, ActiveScriptRubyあたり。 Tk, Gtk2…はきついかも。
>>455 ,456
HSPでも使ったら?
つーかsageろ
ActiveScriptRubyってなんだ? 初めて聞いた
460 :
デフォルトの名無しさん :03/08/08 00:38
>>459 ActiveScriptRuby いまいちピンと来ないのだがASPが例にあるし
これで元の質問にあるスタンドアローンのGUIアプリが作れるのかな?
サンプルコードどこかで見れないですか?
while line = gets do print line if line !~ /var/ end というプログラムが正常に動作してしまうのだが、 『!~』というのは何のクラスのメソッド? Stringにはこんなメソッド、ないようだが。
>>462 ??? HTAとやらを初めて見てビックリ!
HTMLでGUIアプリをコーディングしてるんですね?
なんじゃこりゃ?
EXEに出来れば面白いかもしれない。
466 :
デフォルトの名無しさん :03/08/08 03:35
VisualuRubyならexerbと合わせて使う事でEXEに出来るよ Win環境だけであれば、これが一番お勧め
class C1 A = 1 @a = 2 def self.a [A, @a] end end class C2 < C1 A = 3 @a = 4 end p C1.a #=> [1, 2] p C2.a #=> [1, 4] a が C2::A を見ていないのはなぜ?
>>467 定数のスコープが静的に決まるからじゃないかなあ
class C1
A = 1
@a = 2
def self.a
[self::A, @a]
end
end
class C2 < C1
A = 3
@a = 4
end
p C1.a #=> [1, 2]
p C2.a #=> [3, 4]
>>463 !~ は =~ の否定だよ。 String#=~ 参照。
演算子のところ。だいたい != もココ。
473 :
デフォルトの名無しさん :03/08/08 08:50
474 :
デフォルトの名無しさん :03/08/08 09:14
GUIについて盛り上がってるみたいなので、便乗させて下さい OSXにTclTk(8.4.2)をインストール(バイナリ版)しOSX10.2に最初からインストールされている Rubyでrequire "tk"をすると下記のようなエラーとなってしまいます。 ソースから再コンパイルしないといけないのでしょうか? [Macintosh:〜] % which wish /usr/bin/wish /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 .//test.rb:3:in `require' from .//test.rb:3
>>474 > OSXにTclTk(8.4.2)をインストール(バイナリ版)し
ってことはTcl/Tkは標準じゃないわけ?
たぶん、tcltklibなしでコンパイルされてるんじゃないの。
OSX添付のrubyは、digest/md5あたりでも問題を聞くし、あまりうまくないのかも。
> ソースから再コンパイルしないといけないのでしょうか?
1.8も(一応)出たことだし、それをすすめる。
>>471 みつかった。さんきゅ。
そうか、演算子だったのか。
hash = {} key = [] hash[key] = true key.push 0 p hash[[]] #=> nil なんだか、こういう挙動はあまり好きじゃないな。 たまに嵌る。
hash key に array を使う人はあまり好きじゃないな。
480 :
デフォルトの名無しさん :03/08/08 12:35
スクリプト 言語 にRuby使うひとあんまりすきじゃないな。
>>478 文字列以外は普通 freeze するべ。
文字列がキーのときは勝手にそうなってるだけだし。
LL土曜っていく香具師いる?
>>482 いきてーよ。
くそー。のんびりしてたら満席御礼だったよ。鬱だ。
>スクリプト 言語 にRuby使うひとあんまりすきじゃないな。 これは変だろ。
正規表現における $ では、改行が消えてしまうので困っています。 スクリプト: -------------------- str = "AAA\nBBB\nCCC" str.scan(/(^.*$)/) do p $1 end -------------------- 実行結果: "AAA" ← "AAA\n" であってほしい "BBB" ← "BBB\n" であってほしい "CCC" このとき、"AAA"ではなく"AAA\n"、"BBB"ではなく"BBB\n"であってほしいのですが そんなことは可能でしょうか。
visualuruby 1.8対応 キタ━━━━(゚∀゚)━━━━ッ!! ありがとうございます!
>>487 str = "AAA\nBBB\nCCC"
str.scan(/(^.*(?:\n|\z))/) do
p $1
end
n番目の数値を一つ増やす cvssucc("1,2,a,4", 3) = "1,2,a,5" という関数はどう実装すればいいですか? 数値や文字列問わずというのはできるのですが。
>>492 def cvssucc(s, idx)
s = s.split(',')
s[idx].succ!
s.join(',')
end
>>492 どうでもいいけどcsvsuccだよな。
老婆心での質問だがc??succ('1,2,"a,b",4', 3)でも大丈夫なのか?
老婆は黙ってろ。
>>495 あえてインデントは気にしないよ
もちろん「詳説〜」からのコピペだ。
def csvsucc(csv, index)
ary = []
csv.scan(/\G(?: ^|,)
(?:
" ( (?> [^"]* ) (?> "" [^"]* )* ) "
| ( [^",]*)
)/x) {|qval,val|
if qval
val = qval.gsub(/""/,'"')
end
ary.push val
}
ary[index].succ!
ary
end
p csvsucc('1,2,"a,b",4', 3)
>>489 ははあ、なるほど、$ を使わなければいいのか。
というか、今回の場合では $ を使っちゃいけないのか。
了解しました。どうもありがとう。
>>498 その例に限って言えば、これで良い気もするが。
str.each_line do |line|
p line
end
stackless-python
csvをパースするやつって1.8から標準添付だっけ?
a = [[]] * 10 a[0] << "x" p a #=> [["x"], ["x"], ["x"], ["x"], ["x"], ["x"], ["x"], ["x"], ["x"], ["x"]] 正直、一時間ほどハマりました。
rubyは遅くて使い物になりませんな
trap::空白文字による違い に b = a+2; # a と 2 の和 b = a +2; # a(+2) と解釈される. b = a + 2; # a と 2 の和 ってあったけど、これ単項+のせいだよね? 単項+ っているの??
いる。
>>506 > ってあったけど、これ単項+のせいだよね?
括弧省略文法のせい
>>508 単項+ が無ければ
空白にかかわらず2項+になるんじゃないの?
>>507 単項+ ってそのものを返すだけじゃないの?
だったらいらないと思うんだけどな。
うるさいな、ほっといてくれ!
515 :
デフォルトの名無しさん :03/08/10 20:33
Ruby初心者、というかスクリプト言語初心者なのですが、正規表現中で、 括弧の含まれる文字列の扱いに困っています。 たとえば、こういった場合です。 str = "abc(inside)" if "\(.*\)" =~ /#{str}/ この結果がfalseになります。仕様なのでしょうが、困っています。 同じ理由で、gsubなどの変換関数も使えません。 回避策はないでしょうか。
/\(.*\)/ =~ str
517 :
デフォルトの名無しさん :03/08/10 21:03
str.gsub!(/\(.*\)/, '') をしたいときはどうすればよいですか?
そうしたいときはそうしろ。 何したいんだよ。
519 :
デフォルトの名無しさん :03/08/10 21:15
いけました。動かないと思いましたが凡ミスでした。すいません。
すいません ごめんなさい もうしわけありません
いや俺もいいすぎたよ。すまん
つられて俺も謝っとく ほんとにすまんかった
馴れ合ってんじゃねえよ
ruby 生意気だな
rubyの無礼俺が誤る。 正直すまんかった。
馴れ合いってキモイよな すまんかった
いや、もとをただせば全部俺が悪いんだ。 すまんかった。
Ruby/GtkのCListで set_row_data を使うGtkが必ず落ちる。 助けてくれ。
a=['A', 'a', 'B', 'b', 'C'] p a.sort{|a,b|a.upcase <=> b.upcase or a <=> b} #=> ["A", "a", "b", "B", "C"] sort の中身が前半が 0 であっても or から後ろが評価されていないようなのだけど これでいいんだっけ? ruby 1.8.0 (2003-08-04) [i386-mswin32]
0 は真だから。 Numeric#nonzero? を使って a.sort{|a,b|(a.upcase <=> b.upcase).nonzero? or a <=> b} とやるのかな。
ありがとう。 でもそれだと、最初の条件でソートされなくならないですか?
と思ったらされてるみたいですね。 どんな仕組みになっているんだろ……。 HELP読んでくる。
$ refe nonzero Numeric#nonzero? --- nonzero? ゼロの時nilを返し、非ゼロの時 self を返します。
3.times{} は、あるのに 3.map{} がない理由は?
? 3.map{} にどんな動作を期待してる?
期待する動作がないから?
>>531 nonzero? ってなんかキモいんで俺は下のようにやる
(a.upcase <=> b.upcase) * 2 + (a <=> b)
a.sort_by{ |a| [a.upcase, a] }
>>537 p ((0...3).map{|i| "Title#{i.succ}"}) #=> ["Title1", "Title2", "Title3"]
p ((0...10).map{|i| i*i}) #=> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
など。
(0...) を書くのが作業的で面倒くさい。
でもmapじゃないよなぁ
>>406 を読んでたら 1.8.0 から
> Array.new(10) { |i| i + 1 }
> => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
が、できるようになったらしい。
機能的にはとても満足。
だけど、書くのがさらに面倒だ。
で、ユーザーって増えてるの?
>>541 >>536 見て「ハァ?」って思ったけど、
>>541 でちょっと理解できた。
何かイカした名前を付けれれば、採用され・・・ないか。
zero origin か one origin か、とかそういうレベルでももめそうな悪寒。
>545 zero originだけで良いと思われ。 one originが必要なら foo= 10.map{|i| ・・・・・ } foo.shift で出来るけど逆(one origineな実装時にzero origineな結果を得る) はスッキリ書けないと思われ。
one origine な foo = 10.map{|i| func(i)} って、zero origineな foo = 9.map{|i| func(i+1)} と同じじゃないの? すっきりしているかどうかという問題に関しては、 shiftするのとどっ恋どっ恋だと思うけど。
スタックを増やす方法をおしえてください。
環境を書け。
class Integer def times_collect(&b) (0...self).map{|i| b.call(i) } end alias times_map times_collect end こんな感じかの、名前どおりtimesに合わせて0オリジンで文句は出ないだろ
ナイスネーミング!
$ ruby -renumerator -e 'p 3.enum_for(:times).map{|i|i}' [0, 1, 2]
面倒くさすぎ。
さて、どうやって matz 氏を説得するかの。
>>548 > スタックを増やす方法をおしえてください。
スタック += 1
スタック.拡大(いぱーい)
見てのとおり、スタックが足りない。
あ、ごめん、環境を示したつもりなのか。 mswin32ならコンパイル時に nmake STACK=0x4000000 だ。
>>554 (==
>>550 ?)
名前が今市という気がする。seqってのはどうだろう。
class Integer
def seq(&b)
range = 0...self
if b
range.collect(&b)
else
range
end
end
end
times_map / times_collect ってするんなら、 そもそも times は times_each じゃないと名前が対応しない。 だから times が each という名前を含んでいないのなら、 map / collect の名前を使う必要がない。 だから seq でどうだという解釈でよろしいか?
Python 世界的に有名。ライブラリが豊富。 Ruby 日本でのみ有名。日本語対応で優れる。 でOK?
Python インデント Ruby end end end
>>561 そんなとこかねぇ。あとはman 1 seq。
それと、{collect|map}_*ってのはたびたび出ても通った例がないから、
語順を逆にしてもどうかな、と。
>>564 yieldの実装ってどうなってるの?
yieldが合計100回呼ばれるとしたら要素100の配列を前もって作って返すのか
fiberかなにかを使ってyieldの呼出し毎に値を呼び出し側に返すのか?
568 :
デフォルトの名無しさん :03/08/14 17:43
Ruby/GTK (今は Ruby/GNOME だっけ?) で Gtk::Entry で入力された文字列を右寄せで表示したい のですが、どうすれば良いですか? Gtk::Label は set_justify があるので可能なんですが、 Gtk::Entry にはそれらしきものが無いので...。
570 :
デフォルトの名無しさん :03/08/14 18:08
>>567 が
>>564 を指してるので、どれについて言ってるのかが分からなかったんだが。
Rubyのyieldは、コールバックの呼び出しと思えばいい。
ブロックの実行環境をスタック上に再現して実行する。
LISPだと、こんな機能追加は一瞬でできるのに 他の言語は次バージョンまで待たされるのね。
できてるじゃん。 単に標準で組み込まれるかどうかだけ。
キモイ作者の気まぐれ次第ってことか。
痛い脊髄反射レスが来ましたよ
ruby 1.8.0 で、ある記号処理をしてる。 行を読み、"|" で区切られた部分に分けたい。 s = "1|2|3" a = s.scan(/[^|]*\|?/) p a →["1|", "2|", "3", ""] "3" までは期待通りだけど、最後の "" の意味が判らん。何にマッチしたの? 今は [-2] の末尾が区切り文字じゃない時、[-1] が空文字列なら pop して誤魔化してる。 正規表現、scan の仕様に詳しい人教えて下さい。
>>577 s = "1|2|3"
a = s.scan(/[^|]+\|?/)
p a
↑これだと、["1|", "2|", "3"]になる
[^|]*・・・|ではない文字が0以上
\|?・・・・|という文字が0または1個
3の後に""(空文字)があると考えると、[^|]が0個かつ\|が0個の場合にマッチしている
s = "1|2|3"
a = s.scan(/[^|]+/)
p a
↑これだと、["1", "2", "3"]になる
マッチした部分が配列で返されるから、必要な部分にマッチする正規表現を書けば良い。
>>578 サンクスです。
"1|2||3" の様に区切りが連続した場合は
["1|", "2|", "|", "3"] の様に検出したいんですが、前者の /[^|]+\|?/ だとマズいんです。
後者は、区切り文字そのものが消えちゃうんで、今回の用途に合いません。
もう少しスマートに書けるかと思ったんですが、やっぱ誤魔化し法で行ってみます。
それとも、処理するコードでスマートにすべきなのか。
ありがとうございました。
"3" を抜き出した時点で元文字列は消費しきってるのに、 なんで空にマッチしてるかの説明が知りたい。 マッチする気なら無限にマッチする事も可能なのに、なぜ1回だけ余計にマッチしてるのか。 "1|2|3" → "2|3"、["1|"] "2|3" → "3"、 ["1|", "2|"] "3" → ""、 ["1|", "2|", ""] "" → なんでこれを処理する?
スマソ、間違えた "1|2|3" → "2|3"、["1|"] "2|3" → "3"、 ["1|", "2|"] "3" → ""、 ["1|", "2|", "3"] "" → なんでこれを処理する?
// =~ "" がマッチするから。しかし、"".scan(//)がいつまでもマッチし続けると困るから一回だけマッチするようになってる
s = "1|2||3" a = s.scan(/a*?/) p a これだと、空文字列7個の配列が返ってくる。
>>583 聞いてるのか?
p "aaa".scan(//)
これも空文字列の配列が返るが何か?
正規表現は最左最長マッチする
>>577 s = "1|2||3"
a = s.scan(/[^|]*\||[^|]+$/)
p a
こんなんじゃだめ?
>>579 以下でどう?
# マッチしたいものは
# (a) "|以外の文字列"の連続と "|"
a = / [^|]+\| /x
# (b) "|" のみ
b = / \| /x
# (c) "|以外の文字列"の連続と "文字列末尾"
c = / [^|]+\z /x
re = / #{a} | #{b} | #{c} /x
p "1|2|3".scan(re) # => ["1|", "2|", "3"]
p "1|2||3".scan(re) # => ["1|", "2|", "|", "3"]
以下でもいいみたいだな。
# マッチしたいものは
# (a) "|以外の文字列"の連続と "|"(または「末尾」)
# 「末尾」と言い切れるのは [^|]+ のおかげ
a = / [^|]+\|? /x
# (b) "|" のみ
b = / \| /x
re = / #{a} | #{b} /x
p "1|2|3".scan(re) # => ["1|", "2|", "3"]
p "1|2||3".scan(re) # => ["1|", "2|", "|", "3"]
>>586 正規表現に正規表現埋め込めるのは1.8から
>>584 いきなり聞いてるのかといわれても、自分は誰にも質問した覚えは無いので、
聞いてませんとしか答えようが無いです。
Rubyも汚くなったな。
>>588 聞いてませんとしか答えようが無いといいながら、
聞いてませんと答えていない。
つまり、あなたの主張は矛盾している。
>>589 a = / [^|]+\|? /x
b = / \| /x
re = / #{a} | #{b} /x
p "1|2|3".scan(re)
p "1|2||3".scan(re)
import re a = r" [^|]+\|? " b = r" \| " r = re.compile("%s | %s" % (a,b), re.X) print re.findall(r, "1|2|3") print re.findall(r, "1|2||3") 微妙だがパイソンに一票
>>585 ,586
ありがとうございます。
言葉が足りなかったんですが、言いたかった事は
>>580 さんの通りです。
まだ仕様がありまして、"1|2|" → ["1|", "2|", ""] になる必要もあります(配列は必ず "|" の数+1)。
ヒントを頂いたので、自分で練ってみようと思います。
出来上がった物は近い内に公開する予定です。
>>594 結局 "|" による split なんだけど、"|" を含まなくてはいけないのが難点で
すね。
Oniguruma (ruby を自分でコンパイルする必要あり)なら戻り読みが使えるの
で
re = / (?<=\|) /x
p "1|2|3".split(re, -1) == ["1|", "2|", "3"]
p "1|2||3".split(re, -1) == ["1|", "2|", "|", "3"]
p "1|2|".split(re, -1) == ["1|", "2|", ""]
で、すべて true になります。ちなみに先読みなら素の ruby で使えるけど
以下のようになります。
re = / (?=\|) /x
p "1|2|3".split(re, -1) == ["1", "|2", "|3"]
p "1|2||3".split(re, -1) == ["1", "|2", "|", "|3"]
p "1|2|".split(re, -1) == ["1", "|2", "|"]
素直にsplitして終端以外を"|"追加すれば? 変に凝ると後でわかんなくなる。
>>594 考えたんですが、最後の条件のせいで必ず空文字列にマッチする必要がある
そうすると最初の条件を満たさない。だからscanじゃ無理な気がします。
>>596 "|"を"|\0"とかに置換して"\0"でsplitとか
p "1|2|3". gsub(/\|/,"|\0").split(/\0/, -1)
p "1|2||3".gsub(/\|/,"|\0").split(/\0/, -1)
p "1|2|". gsub(/\|/,"|\0").split(/\0/, -1)
>>597 できた。要Oniguruma
re = / (?<=\| | ^) [^|]* (?: \| | \z ) /x
p "1|2|3".scan(re)
p "1|2||3".scan(re)
p "1|2|".scan(re)
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
分割文字列の最後に "|" を付け加えて /[^|]*|/ で scan して 最後だけ "|" をとればいいだろ
めんどくさいにょ
RAAに登録するときって英語のページを用意しなきゃいけないんだっけ?
>>603 さんくす。
MUSTじゃなくてSHOULDなんですね。
質問があるのですが、 シンボルと文字列はどう使い分けたら良いのでしょうか?
つかどう混同したら良いのでしょうか
つか同根どうしてしまうのでしょうか
module M def foo 1 end module_function def bar foo end end と書くと bar から foo を参照できないのはなぜ?
呼べるよ。 module M def foo 1 end module_function def bar foo end end p Object.new.extend(M).send(:bar) #=> 1 どうせ、M.barでfooを呼べないとか言ってるんだろうけど selfが違うからな。M.fooを定義しろ
モジュール関数ってのはインスタンスに依存しないメソッド なんだからインスタンスメソッド呼んぢゃまずいだろ
611 :
デフォルトの名無しさん :03/08/16 21:17
さんざん既出だと思いますが検索しようがないので質問 Ruby 1.6で hoge=[1,2,3] piyo=hoge piyo.pop p hoge,piyo # hoge=[1,2] piyo=[1,2] foo="baka" bar=foo bar+="aho" p foo,bar # foo="baka" bar="bakaaho" 自分はこれが納得できないのですが、どう理解すればよいでしょうか?
>>611 bar += "aho"
は
bar = bar + "aho"
と同じ振る舞い。
つまりbarは新しく生成された文字列オブジェクトを参照する。
もはやfooと同一ではない。
同値と同一の違い。
つまり一言で言えば
>>612 。
>>611 メソッドには破壊的なものとそうでないものがある。
pop は破壊的にオブジェクトを変更する
+ は新しいオブジェクトを生成する
代入は変数に新しいオブジェクトを割り当てなおす
ふつうはね
pop 盗んだバイクで走り出す += 100円玉で買えるぬくもり
ありがとうございます。 foo="baka" bar=foo bar<<"aho" p foo,bar # foo="bakaaho" bar="bakaaho" ですね。 Perlと混乱していますが、"="について、 a=b+'c'(右辺と左辺が違う場合)はaに新しいオブジェクトが割り当てられるが a=b では新しいオブジェクト割り当てはせず、aとbは同じオブジェクトを指す ということですか?
String#+(other) メソッドが新しい String オブジェクトを返す
s1 = "baka" s2 = "aho" s3 = s1 + s2 s4 = s1 << s2 p s1.object_id p s2.object_id p s3.object_id p s4.object_id p s1 p s2 p s3 p s4
右辺、左辺の問題じゃなくて メソッドが新しいオブジェクトを返すかどうかってことですね・・・ すみません
ぐぐったが言わんとしてることがわからん taint関係? 俺が腐ってる?
俺もわからん
どちらかというと、別のスレに似合う言葉だな。
>>625 ふと別スレを覗いてみたらどうしようもなく荒れてるな…。
ある Hash から、特定のキーだけ抜き出した Hash を作るのに、なるべく簡単にやる 方法はないでしょうか? values_at は配列を返しますが、hashを返して欲しい。
given_keys.inject({}) {|h,k| h[k] = given_hash[k]; h}
h = {1=>1,2=>2,3=>3} newh = h.reject {|k,| k % 2 == 1} p h p newh {1=>1, 2=>2, 3=>3} {2=>2}
h = {1=>1,2=>2,3=>3} need_keys = [1,3] h2 = h.reject {|k,| not need_keys.member?(k)} p h2 # => {1=>1, 3=>3}
具体的な例も書けよ。
ruby 1.8.0 (2003-08-04) [i386-mswin32] で 多倍精度の浮動小数点型を使うにはどうしたらいいのですか?
>>633 require 'bigdecimal'
a = BigDecimal("0.1")
b = BigDecimal("0.0")
10.times { b += a }
puts b == 1 #=> true
# ただし、Floatとの演算では暗黙のうちにBigDecimalがFloatに
# なってしまうため、一箇所でも間違ってFloatのリテラルを
# 混じらせると任意精度が保てなくなる事には注意。
BigDecimal を使わない方法で教えてください
636 :
デフォルトの名無しさん :03/08/17 19:47
Ruby を使わない方法も教えてください
Pythonに乗り換える方法を教えてください。
Pythonから乗り換える方法を教えてください。
素直にどっちも使えば?
>>100 違います。immediate だからではなく、 immutable だから、だよ。
ぶへ、リンクたどってきて激しく前のレスに反応してしまった。スマソ
>>629 ruby 1.6.8 で、inject を使わない場合は?
each でまわすしかないかなあ。
644 :
デフォルトの名無しさん :03/08/17 23:29
RubyのGCについて語ってくれる人募集
645 :
デフォルトの名無しさん :03/08/17 23:34
>>644 別スレからこぴぺ
matzは彼の博論を受け取ったらしいが、そういえば
matzはちまたの論文を最近も読んでるのだろうか?
もしそういう時間を取れていないのなら、Rubyの実装も
古い世代の設計のままになるという事だよね。
これへの反応は
かなり前だが1.8ではrandのアルゴリズムが変わってるみたいだし。
そういう情報は勝手に入って来るんじゃね?
だった。
自分としては、「勝手に」というのはちょっと違うかと。
randの話なら、MTは他の言語処理系やGLibなどでも
採用されはじめたことで(加えて国内の研究の成果であったことも
ちょっと心理的な追い風となって)Rubyでも採用されたという
経緯があると思う。
確かに、例えばBohemGCを参考にする必要はあるだろうが、
「勝手に入ってくる」範囲内の、つまりはオープンソースの他の
処理系の実装の情報だけでGCを実装していたら、
Rubyの拡張ライブラリでもPythonのようにリファレンス・カウンティングを
するはめ(失礼)になっていただろう。
つーことで、GCの専門家で、Rubyの行く末について語ってくれる
方を激しく募集。
>GCの専門家 まるっきり別なものを想像してしまった・・・
649 :
デフォルトの名無しさん :03/08/18 01:16
先生! open3とexecとsystemって、どう違うんですか!%x(...)とか`str`との違いも よくわからんです。 open3が速かったりするのかな?
>
>>649 open3 子プロセスのstdin/stdout/stderrを個別に扱う。3つのIOを返す。
exec 自プロセス自体を置き換える。戻ってこない。
system 単純に子プロセスを実行。終了を待つ。正常終了(status=0)したらtrue、それ以外か実行に失敗したらfalseを返す。
%xと`` 子プロセスのstdoutを読み込んで、Stringとして返す。
>>653 ruby powerpc-nintendo-gamecubeキボンヌ。
gtkでVBoxにボタンを追加した後にそのボタンを削除しても ウィンドウが元の大きさに戻らないけどどうすればいい? require 'gtk' w = Gtk::Window.new w.add v = Gtk::VBox.new v.add button = Gtk::Button.new("delete button") v.add vbox = Gtk::VBox.new 10.times {|i| vbox.pack_end Gtk::Button.new(i.to_s) } button.signal_connect('clicked') { vbox.each {|b| vbox.remove b } } w.show_all Gtk.main
p ('0377'.to_i) # → 0 p ('0b11'.to_i) # → 0 p ('0xFF'.to_i) # → 0 ショックだ。期待と違う。 3年位使ってて、さっき初めて気づいた。
間違えた。 p ('0377'.to_i) # → 377
to_iで基数を指定できる(0なら自動判別)のは1.8から? p ('0377'.to_i(0)) # → 255 p ('0b11'.to_i(0)) # → 3 p ('0xFF'.to_i(0)) # → 255
>>655 俺も知りたい。
set_usize, set_default_size, size_allocate, size_request が
関係してそうだけど色々試しても全然思い通りいかん。
>>658 おお、知らなかった。サンクス。
早速1.8.0へ乗り換えよう。
こーいう差異もまとめて、またRuby本を出す予定なんてあるのかな。
matz本のruby1.8バージョン欲しいなあ。たしか1.4ベースだよね。
自動的に縮小はしないけど、こんなかんじでどうよ? button.signal_connect('clicked') { window_size = w.size_request vbox.each {|b| window_size[1] -= b.size_request[1] vbox.remove b } w.resize(*window_size) } ちなみに、gtk2 でしか試してないです。
664 :
デフォルトの名無しさん :03/08/18 19:21
>>665 ユーザ数の事を言ってる?(w
でも、コード書いてて引っ掛かった時に、リファレンス代わりになる物が欲しいと思う。
Web やら ML やらから今までの変更を断片的に追うより、網羅的な物が。
つかバイブルが最新の仕様に対応するのは当然だろう。 と無責任に言ってみる。
668 :
デフォルトの名無しさん :03/08/19 00:01
質問です
http://www.ruby-lang.org/ja/man-1.6/index.cgi?cmd=view;name=Array#insert を見つつ
ruby 1.6.7 (2002-03-19)で
class Array
def insert( n, *vals )
self[n, 0] = vals
self
end
end
a = [3,4,5]
b = [1,2]
a.insert 0, b
p a # => [[1, 2], 3, 4, 5]
となるんですが
[1, 2, 3, 4, 5]
ってしたい場合はどうやればいいんでしょう?
a = [3,4,5] a[0,0] = [1,2] p a #=> [1, 2, 3, 4, 5]
>>666 リファレンス代わりの本だったらprogramming rubyじゃねえの。
おれはWebのマニュアルが最新情報に対応して検索もできていいと思うけどね。
>>668 どうしてもそのメソッドでやるんなら、返値の self を self.flatten! にするとか。
672 :
デフォルトの名無しさん :03/08/19 01:07
>>669 即レスどうもです
わざわざinsertを用意しなくてもできるんですか
全然しらんかった
>>671 どもです
self.flatten!も知りませんでした。
でも二次配列(?)を追加したいんで…
と番号なかった
>>662 p w.size_request #=> ( 84, 242)
p w.size_request[0] #=> undefined method `[]' for ( 84, 242):Gtk::Requisition (NameError)
p w.resize(10,10) #=> undefined method `resize' for #<Gtk::Window:0x4025ed68> (NameError)
gtk1だと全然ダメだった。
ParseDateモジュールなるものがありました。
>>675 こんなんでどう?(もう試してるかもしれないけど)
button.signal_connect('clicked') {
window_size = w.size_request
vbox.each {|b|
window_size.height -= b.size_request.height
vbox.remove b
}
w.set_default_size(window_size.width, window_size.height)
}
>>678 再び試したけどウィンドウサイズは変わらんかった。
そもそも set_default_size は最初に開いたときのサイズでしょ。
resize っつーのがないと、後から変更するのはもう無理なんじゃないか。
680 :
デフォルトの名無しさん :03/08/19 12:43
全ての 'test/unit' のテストの起動つてどうやるの Dir.glob(**/*_test.rb') { |f| require f } なんてやっても自動的にテストが呼び出されてテスト始まるんだけど、 しかし、setup が実行されなかったりする
ファイルが違って同じテストクラス名だと setup が実行されないことがあるようですた 失礼しますた
リリース版の同梱ライブラリでも C:/ruby/lib/ruby/site_ruby/1.8/amrita/xml.rb:101: warning: toplevel constant File referenced by REXML::File てな warning が出るのはどうにかならないだろうか
何に同梱されてたんだよ。
VisualuRubyでフォーム作るときに背景色指定するには どうすればいいんでしょうか?
コントロールパネル → 画面 → デザイン あたりで好きにいじってください。
688 :
デフォルトの名無しさん :03/08/20 01:58
>>647 LL2とかOOPSLAとかOSCONとかに行ってるんだから、最近の研究(最新、じゃない
かもしれないけど)の話が出てこないわけがないでしょ。
もちろん、話を聞いたからといって、採用するかどうかは別でしょうし、
いまいち理解できない分野もあるんでしょうけど(特に数学方面とか)。
>>685 元の655だけども、同じくうまく行ってない。まだ
いろいろは試せてないけど。もうちょっとあがいてみます。
ちなみに、ruby-gnomu CVS (gtk-1.2) と ruby 1.8.0 CVS でした。
gtk2.0 にしてみます。
返事遅れてスミマセソ
ASP(active server page)使わなきゃいけない仕事で、できること ならrubyで書きたいんだけど、仕事でASPをrubyで書いている人い ますか?ついでに何でそんなもん使うんだという問いに対する効果 的な解答例も。 Windows 2000のサーバで、drbのサーバを動かしっぱなしにして仕 事させてる人はいますか?
selfを書き換えるにはどうするの? Stringにはreplaceってメソッドがあるらしい事は判ったんだけど、 やろうとしてるのはFloat。 より具体的に、saturate!(min,max)というのを考えてる。 selfがmin未満ならminに、maxを超えてたらmaxにする。 組み込みでもうあるかな。 Floatのメソッドじゃなく、関数にしちゃえば解決かもしれんけど、なんか面白くない。
694 :
デフォルトの名無しさん :03/08/20 20:52
>>692 代入を伴ってもよいんなら、
class Float
def saturate(min, max)
return min if min > self
return max if max < self
self
end
end
やね。
でも、1.1.saturate!(2, 3)って意味わけ分からんやん。
>>693 ,694
ありがとう。
そっかー、変数で呼ぶ事ばかり考えてて、定数で呼ぶのは想定外だった。こりゃ変だ。
どうもこの辺の発想が出来ねーんだよな俺。
「人生の脱北者でも味わえるRubyのお勉強」きぼん。
久々に初心者向けRuby本、Rubyの冒険がでたが、えっApolloでやんのってちょっと驚いた。 GUIなプログラム作れないと初心者にはガッカリ度が高いかもなので、敷居が高くなってもこの方がいいのか。
>>697 「熊谷秀武・著 吉田和弘・監修」だから、Apolloは必然と思われ。
K光ML読んで[るた]人に聞きたいんだけど、この本は正直どうなん?
K光ML読んで[るた]人じゃなくていいんだけど、この本は正直どうなん?
たしか著者は変数入れ物説を唱えていた そのことに激しく違和感
>>686 気付いてるかもしれんが、作者さん日記に回答が。
>>690 最終的に
>>662 で行けました。
ruby-1.8.0 CVS
ruby-gnome2 CVS (ruby-gnome「2」ってあるの知らなかたよ。まぬけ)
gtk+-2.2.2
っとすべて最新で以下
>>678 のは残念ながら
undefined method `height' for [93, 308]:Array (NoMethodError)
と出てダメでした。
どもありがと。これを元に勉強させてもらいます。
しかしTkの方が楽だね。何かと。
>>703 require 'gtk2'
Gtk.init
w = Gtk::Window.new
w.add v = Gtk::VBox.new
v.add button = Gtk::Button.new("delete button")
v.add vbox = Gtk::VBox.new
10.times {|i|
vbox.pack_end Gtk::Button.new(i.to_s)
}
button.signal_connect('clicked') {
window_size = w.size_request
vbox.each {|b|
window_size[1] -= b.size_request[1]
vbox.remove b
}
w.resize(*window_size)
}
w.show_all
Gtk.main
>>701 そんなこといってたのか…
おれが思うに変数は紐だと思うw
Rubyの変数は入れ物ではないので、
>>705 が正しい。
紐だって例えは初めて聞いたけどいいな オブジェクトが犬あたりか 誰からもつながれなくなった犬は山に帰っていくわけですな
関係ないが、変数という名前自体が間違い。 変物と呼んでくれ。
関係ないのなら、変物と呼びません。
荷札 tag
変数は紐、定数はオブジェクトにしっかり接着された紐というたとえをruby-listでみたことがある
最近は定数はあんまりオブジェクトにしっかり接着されてないけどな。
715 :
配列について質問 :03/08/22 02:59
初心者ですが質問させてください。 2次元以上のArray(またはNArray)で、各次元についての大きさを知るに はどうしたらよいのでしょうか。例えばm行n列の行列を表す配列について、 mやnの値を知るにはどうするのでしょうか。 array.sizeだとm・nの値が戻ってきてしまうようですが。
(補足) どこか別の場所でarray[m,n]が定義されていて、その形を知らずに arrayとして受け取った場合を想定して、です。
m・n の値って何?
>>717 mとnの積、つまり配列要素の総個数です。
>>719 なるほど、わかりました。
ちょっと自分が勘違いしていました。
a=[[1,2],[3,4],[5,6]]
print a.size,"\n"
print a[0].size,"\n"
=>
2
3
ですね。有難うございます。
失礼。 => 3 2 でした。
変数とは窓である、と言ってる人もいたね。 ちなみにrubyで定数が再代入可能になったのは4年くらい前。 あんまり最近じゃない。
なんで再代入可能にしたの?
[ruby-dev:7484] 私見では、どっちも理由になってないとは思う。 前者はインタプリタエンジンの都合でしかないし、後者は今は本物のクラス変数があるし。
前者の回避策として「エラーにはしないけど警告は出して再代入は しない」という選択肢は、なぜ採用されなかったんだろう。
それ、ちっとも問題が回避されてないよ。
>>726 問題は
プログラム実行中→
あるひとかたまりのソースを書き換えた→
止めずに更新したい→
再評価のためload→
定数の初期化で例外→
最後まで評価されない→マズー
ということではないの?定数初期化の変更も含めて更新したけりゃ一度止める
しかない、でいい。定数に再代入できるんじゃ実質的には変数と変わらんな。
それにしても今まで気づかなかったよ。
何に気づかなかったのですか?
>>727 定数に代入した値がまずかった場合、何度ソースを書き換えても
同じところでエラーが出る。
つまり再代入できないと問題は回避されない。
理想はインタプリタの完全な再初期化を提供することだけどね。
>>729 意味わかんない。具体的にどういうシチュエーションの場合を言ってるの?
場合の場合って意味がわかりません。
まえに定数を警告なしに上書きしようと思て、継承して再代入してみたけど、 定数がレキシカルスコープなことを知らなくてはまった。
元々は次のシンプルなクラス関係だった。 class C1; def bar; 1 end end class S1 < C1; def foo; bar end end ところが、C1 と同じ外見の次のクラス C2 を作ることになった。 class C2; def bar; 2 end end 今後、C3 が作られる可能性もある。 そうした状況で C2 の機能を持った S2 相当を作る2つの方法を考えた。 方法1 - 継承しないで生成時にC1かC2のオブジェクトを渡す。 class S def initialize(x); @x=x end def foo; @x.bar; end end 方法2 - S1の内容をモジュール化してS1とS2に入れる。 module M; def foo; bar end end class S1 < C1; include M end class S2 < C2; include M end みなさんならどうする?
追加。 方法3 - 方法1と同じ(だけどS1のコード内容をほとんど変更せずに実現する) require "delegate" class S < SimpleDelegator def initialize(x); super(x) end def foo; bar; end # @x.bar 形式に変える必要がない end というのも思い付いた。
そのためのmix-inだから、方法2かねぇ。 実行時に対象が変わるんなら方法3とか、 C1,C2のインスタンスに直接手を加えていいならextend(M)というのも。
参考になりました。
※全角空白でインデントしてます。 1 : class Foo 2 : def initialize 3 : @bar = "test" 4 : end 5 : Quux = Proc.new do 6 : print "#{@bar.size}\n" 7 : end 8 : def baz 9 : Quux.call() 10 : end 11 : end 12 : 13 : foo = Foo.new() 14 : foo.baz 6行目で、インスタンス変数@barがnilだと怒られる。 class内で定義したProcからインスタンス変数を参照する方法ってありますか?
補足。 defなら回避出来ますけど、手続きを配列化して呼び出す必要があります。 defのメソッドをジャンプテーブル化なんて出来ませんよね?
Quux = <<EOT do print "#{@bar.size}\n" end EOT def baz self.instance_eval(Quux) end これも駄目か。instance_evalに対する理解が間違ってるかな。
@bar のスコープは Foo インスタンス変数内、 Quux, Quux 内の @bar のスコープは Foo クラスインスタンス変数内。
>>738 def quux
print "#{@bar.size}\n"
end
Quux = instance_method(:quux)
def baz
Quux.bind(self).call()
end
>>743 氏の方法で解決しそうです。
ちゃんと理解出来てないかもしれませんが、理解のきっかけは頂きました。
レスして下さった方々、ありがとうございます。
あぼーん
>>745 ArrayやHashにメソッドを入れて間接的に呼びたいと思い、ジャンプテーブルと表現しました。
すみません、手続き型言語に染まったオールドタイプなもので。
俺はニュータイプだ!
>>738 Proc オブジェクトでなく Method オブジェクトを利用すればいいんでない
ruby-list に痛いヤシがいないか?
参照、インスタンス=オブジェクトで十分じゃん。 万難を排して日常用語に無理やり噛み砕かなければならないなんて 聞き手を馬鹿にしすぎでないのか。本当の馬鹿が使わなければならないほど Rubyは日常的に不可欠なツールでもないだろ。
使ってれば変数の意義がわかると思うのだがなぁ
>>749 なんと、Methodオブジェクトなんていう物があるんですか。
うー、古いRubyで知識が停滞しちゃってるなぁ。
>>707 の「山に帰る」って説明が(・∀・)イイ!!
しかし、MLであそこまでムキになる問題かなぁ…。
>>754 たぶん、今までたまっていたのが爆発したんでしょう。
>>754 野良犬は保健所に捕まって殺されちゃいます
カワイソウニ
変数は紐のようなもの、と聞いて物理の超紐論を思い出して混乱してました(w 紐というのはオブジェクトと名前の書かれたタグをつなぐ紐ということでしょうか?
女性におまんまを食べさせてもらってるような男のことでつ。
そもそも、知ったかぶって他の物に例えようとするのが間違ってんだ。
しかしRubyで変数容器論は受け入れがたいな。 新人にCを教えるのに変数容器論で説明してるのを聞いたことがあるけど、 Cではそれもいいだろう。だけど、RubyやLISPみたいな言語で、そんな 説明するのはひどくないかい。 その路線でRuby入門書を書いたとなると、ムキになるのもわからないでもない。
変数をトランシーバー(無線機?)に例えるのはどうですか? 変数にオブジェクトを代入する事は、そのオブジェクトと通信するために 周波数を合わす事。
あんまり無理してメタファにこだわるのはよろしくないのではないかと。
叩かれてるほうの人は全般的に理解が浅いし、いいかげんすぎるなあ 以前の投稿も的外れなものが多いし
あれだ、もう変数に代入というのを止めよう。 ロール名にアサインするとでもしとけばいい。
名前に束縛で良いんじゃないの?
べつに変数は入れ物でいいんじゃないの? 入れ物に紐入れるということで
>>766 それじゃ a = b = Object.new がよく分からん
イメージとしてはbindだろうけど。 束縛なんて全然語感があわない訳語を割り当てたヤシが悪い。
>>767 なんで?
紐は何本あってもいいんだろ?
boundはfreeの対義語だから自由に対して束縛というのは悪くないと思うが
Rubyの冒険、入門書全体としてはどう見ます。いや、比較の対象が少ないので・・・ですが。 数少ない初心者向けRuby本な訳で、がんばってくれるとうれしいのだが。 たのしいRubyのほうがGUIやらせなくいい分、初心者には手っ取り早くていいかという気もするが、 Rubyの冒険のほうが何かしたいって意味では具体的で、気持ち的には初心者にはとっつきやすい気も。
ひも付け
774 :
デフォルトの名無しさん :03/08/25 13:15
囚われの身
接続
自由変数←→ひも付けされた変数 自由変数←→囚われの身変数 自由変数←→接続された変数 どれもイクナイ!
自由変数という呼称には疑問無しなんだ?
そもそも"変数"というのがおかしい!と主張してみる。
識別子(identifier)に統一する?
オブジェクトにはすべて固有の番号がある。 変数に入っているのはこの番号。 だけでいいじゃん。紐だの矢だの持ち出さなくても。
そもそもCプログラムを知らない人はrubyを使わない。 だから「変数はポインタ」だけで通じる。
> そもそもCプログラムを知らない人はrubyを使わない。 んなわけない。
>>782 Cを知らないのに「変数はポインタ」って通じる?
野良猫メタファーを考えてたら、MLに投稿されてた。
同じ事を考える人はいるんだなー。
ま、個々人で納得がいけばいい訳であって、妙に強要されなきゃどうでもイイや。
所詮はメタファーだし。
Riteでも多重継承は導入されそうにないな。 ところで思うんだが、通常のクラスではMix-inで事足りるとしても、 例外クラスだけは多重継承を認めたほうがスマートにならないか?
>>786 [ruby-list:38131]とかのことかな。
>>784 あなたには日本語が通じていないようだ。
Cプログラムを知らない人はrubyを使わない=rubyを使う人はCプログラムを知っている人だ
tkて人うざいんだけど
>>787 ありがと
>>785 スマートというより例外的wでトリッキーな感じがしないでもないな。
C#/JavaみたいにException.InnerExceptionでサブ例外をぶら下げて
ExceptionがSMTPErrorでInnerExceptionがTimeoutErrorにした方が自然で手抜きしやすいかも。
#これがRuby的なアプローチかどうかは知らないけど。
>>788 そっか、スマソ。
どうも否定が複数現れるとParse errorになる様だ < 俺の脳内Parser
tkの敵が増えてきたな。でも、このまま容器論をつらぬいて欲しい。 いずれにしろ、容器でも参照でも適当に説明がつくから、 あとは、説得力のある文章を書いた方の勝ちだな。
容器はあるでいいでしょ。 容器の中に何がはいってるのかが問題なのであって。
もう秋田
禿同
それにしても、こんなので延々と叩き合いする世界ってキモイ。 ちょっと、入り込めない世界だ。村社会というか... はやらんわけだ。
ツマンネ
詳説C言語のポインタの説明みたいなもんか? こっちの本の著者は誰だっけ?
あるメソッドが非破壊的メソッドか破壊的メソッドかが、なかなか覚えられません。 というか、混乱しまくってます。 両方あるときは ! がついてるからわかるんですが、 なにか法則みたいなのってありますか? みなさんは、どういう風に覚えてますか? ↓こんなのだったら覚えやすいのになー。 すべてのメソッドを破壊的メソッドとして作って、非破壊的メソッドを使いたい時は オブジェクトを複製してから破壊的メソッドを使うとか。
一貫性が無くて覚え辛いことはメモとって覚えるしかない。
でも!が付いてない破壊的メソッドで、 非破壊的メソッドと紛らわしいものって一体なんだろう?
>両方あるときは ! がついてるからわかるんですが、 無視してください。 破壊的と思って使ったら非破壊的だったりする時ってないですか? この前、Array.compactを使ったら、破壊的じゃなくて、はまってしまった。 それから、破壊的、非破壊的が妙に気になるようになって 混乱中。
警告をもっと出す様にしないと駄目だな>意味解析
>>802 ri とか refe とか常備しとけ。
% ri compact
---------------------------------------------------------- Array#compact
arr.compact -> anArray
------------------------------------------------------------------------
Returns a new array based on the arr with all nil elements removed.
[ "a", nil, "b", nil, "c", nil ].compact #=> ["a", "b", "c"]
% refe compact
Array#compact
--- compact
--- compact!
compact は self から nil である要素を取り除いた
新しい配列を返します。compact! は変更を破壊的に行い、変更が
行われた場合は self を、そうでなければ nil を返します。
例:
ary = [1, nil, 2, nil, 3, nil]
p ary.compact #=> [1, 2, 3]
p ary #=> [1, nil, 2, nil, 3, nil]
ary.compact!
p ary #=> [1, 2, 3]
p ary.compact! #=> nil
調べないとわからないということは驚き最小の法則の構築に失敗しているということだな
807 :
デフォルトの名無しさん :03/08/27 09:01
指差された変数 というかポインタ
>>806 漏れは今まであまり破壊的か非破壊的かについては裏切られたことないんだけど、
やっぱり驚き最小の法則っていうのは、「誰にとっての驚き最小か?」ってところで、
ムラというか個人差というか向き不向きみたいなものがあるんじゃないかなぁ?
∧ ∧__ /( ^^ ) /\ これからも僕を応援して下さいね(^^)。 /| ̄ ∪∪  ̄|\/ | たけ |/ 箱男
「たけの共有」でつか?
>>808 それも、変数を「箱」と見るか「参照」と見るかによって感想が違うのかな。
箱派じゃないけど、!をつけとくべきだったろうと思うのはいくつかあるよ。
「箱」と「参照」を同レベルで扱うのかァ 参照じゃ全然とたえてないでしょ それに即値はどうすんの。やはり紐じゃなくて箱でしょ
即値ってFixnum,Symbol,true,false,nilのことか? それだって参照。
箱派キタ━━━(゚∀゚)━━━!!!!!
お互いに強制しなけりゃ、「箱」でも「参照」でもイイよ。 遠回りの理解をしようが恥をかこうが、自己責任でいこう。
箱のほうがわかりやすいと思うけどなぁ。 つまり全部ポインタってことだろ?
C言語知ってる人間はその方が混乱がないかもね
おわアイデンティティを示してしもた。655と819は同一デス
Rubyモデルを説明するためには紐・名札がわかりやすい。箱説を持ち出す必要なし。 rubyの実装すなわちC言語(=高級アセンブラ)レベルで説明しようとすると箱が出てくる。 という結論ではありませんでしょうか。おしまい。
>>821 所詮ノイマン型計算機上で動くんだから、あまり抽象化すると
今度は現実とのギャップに悩むことになると思うよ。
大体 to_i や to_f なんて箱物(計算機)のイメージそのもの。
getuid 等にいたっては妥協以外の何者でもないしね。
説明だけなら「紐・名札」が良いように思えるけど、それで充分
とも思えないね。
これはまた激しくズレたやつが出てきたな。
箱モデルで初心者向けの本を出版したのが、一部の人には気にくわなかったん だろ。
まるで、宗教論争だな。 って、作者が○モン教か!
「箱男」よりも「砂の女」のほうが万人向け。
初心者用の本を出したところで初心者は Rubyなんか見向きもしないだろう。 初心者よりもむしろRubyにどっぷり使っている人たちが 購入し、そしてアラ探しをするだけ。
ついでに「終りし道の標べに」も読んどけ。
んじゃ、ひさしぶりに読みます。
>>781 そのとおりだね。
そういや某オブジェクト指向言語の、オブジェクトを格納する変数の型の名前はは“id”だっけ。
だから変数は箱だろ! a=b a=c
函数
Lisp界ではこういう論争はなかったのか? この点ではRubyとそんなに差がないと思うのはおれの思い違い? セルの絵の説明で話しがついちゃうからないのかね。
Lisperは頭がいいから不正確な概念のマッピングなど しなくても直接理解できてしまうのさ。
スマン。815の言っている即値だって参照がよくわからん Rubyの即値とそうでないもの、 それとCの変数のポインタと値と参照、 それらを交えてだれか講義してくれ ところでCに参照ってあったけ‥?
どーでもいいじゃん
そういや、ルートオブジェクトで既にidメソッドが定義されてるのを知った時は クソ言語かよと思った。
>>838 例えば数値 の 0 を考える。
Ruby では数値もオブジェクトなので Ruby スクリプト内の 0 という記述は
Rubyシステム内に存在する「0 (という現実の数値) を表すオブジェクト」
への参照を表していることになる。
idってよく使いそうな名前だからじゃないかと
ま、 .1.8 からは object_id になったから安心しとけ。
>>837 そんなことねーだろう. Lisp の場合は変数云々より scope と extent の概念のほうが
初心者には厄介だと思うが.
Fixnumとかが即値っていうのは、実装の都合の話をしてるんであって、 モデル的には参照と同じなのよ。
もまえら過去レス嫁。おんなしことばっか何遍も繰り返して、箱男か。 「全部」をクリックして「即値」を検索してみなはれ。
マジッスか‥ 変数は参照で、即値系はその変数以外の実体があると? ところで、過去ログ調べると即値は参照であるってあるんですか? > 848 てっきり、 即値系以外の変数は参照のように振舞って、 即値系はその変数の値自体から求まると思っていましてよ で、idはその変数の値から算出して、ゆえに同じ数字のIntegerオブジェクトは同じidを持つと もし即値系も参照であるとするならば、どうして同じ数字のIntegerオブジェクトは同じidなんでしょう? 即値系の実体ってRuby起動時にはじめから全て確保されているんですかね それでハッシュでどの値がどこにあるか保持しているとか??? 即値系とそうでないものを区別する実装の都合ってなんでしょう?
IntegerじゃなくってFixnumでしたね‥
性能
とりあえず、まつもといしづかのRuby本読め。 実装について書いてるぞ。 そういえば、いしづかさんはラショナル辞めちゃったんだろうか。
「即値系」とかいう、Rubyのモデルと関係ないところから引っ張ってきた俺様概
念を捨てろよ。それから虚心坦懐に
>>852 のいう本を読め。
immutableなら即値で持ってても参照で持っててもオブジェクトとして扱う上では違わないしな
Rubyの命名者っていしづかさんだったって知ってた?
知ってた Perlというネーミングの二番煎じみたいでださくかんじる
>>857 俺は割とイイ名だと思う。
それより、PerlのせいでPearl(真珠)の綴りを間違って覚えてるプログラマってのが大勢いそうで怖い。
誕生石の順番からすると、パール、ルビーの次はペリドットだな。 だれかペリドット言語を開発してくれ。
ペリ.NET
おれはSakuraがよかったな。
おれはKokoroがよかったな。
ちうかまつもとさんはあんまり国産ってのにはこだわってないというか むしろ外に出て行きたいのならRubyという名前を付けた戦略はアリかと。 国産っぽくて外人が知ってそうな日本語だと侍とかでいいような。 しかし、オブジェクト指向言語侍、とか書くと OOLじゃない言語をぶった切るストーリーの何かに見えてしまう罠。
おれはAzumiがよかったな。
萌え系の名前は人前で会話するのに恥ずかしいと思うゾ。
侍→映画「あずみ」 という連想だったんでつが 萌え系って何でつか?
>>859 和名橄欖石ねぇ。
しかしまたPではじまる言語か。
RHG本でどういう解釈をしたらいいのか、わからない部分があります。 それは93ページ「構造体の隙間」の解説 16行目 「つまり struct RObject が増えるほどポインタ二つ分のメモリが無駄になっていく」 という部分。 これは、RObjectはRStringなどに比べてポインタ二つ分の メモリを活用していないという意味なのかな? iv_tbl が RString などにあると RString が増えるほどメモリが無駄になる という説明をしているんだと思うのですが、その説明がいまいちよくわからんです。
>>868 > これは、RObjectはRStringなどに比べてポインタ二つ分の
> メモリを活用していないという意味なのかな?
そう。オブジェクトの管理の都合上、すべて同じサイズになってる。RObject
はRBasic以外にはiv_tblしか使ってないから、それもRBasicに移動するとなる
と、三つ用意されているそれ以外の領域が全部無駄になってしまう。
> ちうかまつもとさんはあんまり国産ってのにはこだわってないというか > むしろ外に出て行きたいのならRubyという名前を付けた戦略はアリかと。 ちうかPerlをあからさまに意識したネーミングした段階で国産であろうが 外人がつけたネーミングであろうが二番煎じでださい
C++やC#と似たようなもんじゃん。
>>870 レス読んで本何回も読んでやっとわかりました。
最初読んだとき、メモリを無駄にする元凶がRObjectにあるように
書かれていると受けとってしまい、それが理解の妨げになっていました。
まとめると、RStringに iv_tbl が入っていると、それが原因で RObject が
利用しない領域がさらに増えてしまう。
RObjectが利用しない領域を減らすためには RString の
サイズを減らさなければならない。だから iv_tbl を外すことになった。
ということですね。たぶん。
「iv_tbl はメモリを節約するために外すことになった」ということは分かりました。 しかし、同じページの後の説明で、 「iv_tbl を配置することによって得られるメリットは多少のメモリ節約」 と、相反することが書かれていて混乱してます。 これは全体のメモリ節約ではなく、 generic_iv_tbl を導入しない ということだけに対してのメモリ節約なんでしょうか。
∧ ∧__ /( ^^ ) /\ これからも僕を応援して下さいね(^^)。 /| ̄ ∪∪  ̄|\/ | たけ |/ 箱男
./tdiary.rb:521:in `open': Too many levels of symbolic links - "/home/matz/diary/tdiary.conf" (Errno::ELOOP) ./tdiary.rb:460:in `load' ./tdiary.rb:374:in `eval' ./tdiary.rb:460:in `load' ./tdiary.rb:374:in `initialize' index.rb:21:in `new' index.rb:21
ところで、即値参照派(紐派)はまともな説明が
>>843 くらいしかなく
あとは、過去ログにあったと思うぞとか、きっとRuby本にそう書いてあるよ
しか言ってないんですけど‥
そうでない方のは
>>849 と
>>855 くらいですが‥
即値ってやっぱり参照じゃないんじゃない?
>>877 確か、JRubyの実装ではFixnum等も即値でなく参照だった。
即値なのはFixnum、Symbol、TrueClass、FalseClass、NilClassだけだよね?
だけど、これらのクラスのインスタンスに対する破壊的メソッドは存在しない。
つまり、参照だろうが、即値だろうが、動作自体にほとんど変化はない。
だから、参照という前提で扱っても構わないだけなのでは?
でも、
1073741823.equal?(1073741823) # => true
1073741824.equal?(1073741824) # => false
と1違うだけで動作が違うのは嫌ですか?
>>873 RStringじゃなくてRBasic。
>>874 > これは全体のメモリ節約ではなく、 generic_iv_tbl を導入しない
> ということだけに対してのメモリ節約なんでしょうか。
そう。
あと、iv_tblをRBasicに入れれば、今のgeneric_iv_tblよりも一回ハッシュの
アクセスが減るので速くなるってのはあるけど。
RObjectとか(RFileもかな)を他のと別に管理するという手も考えられるけど、
Stringとかのインスタンス変数なんてそんなに使うもんじゃないし、第一面倒。
>>877 好きなように考えればいいけど、こういうのは参照と考えたほうが納得しやす
いような気がする。
module Kernel
attr_accessor :foo
end
2.foo = "two"
p (1+1).foo # => "two
>>880 p ((1 + 1).foo) では? (ver. 1.6.7)
p (1+1).foo です。(ver. 1.8.0)
884 :
デフォルトの名無しさん :03/09/01 00:32
>>880 それこそRubyレベルで即値だってことが露呈する唯一の箇所だよな
ちがうと思う
>>884 immutableと即値の区別がついてねーな。
もちろん、そもそもレイヤの違う用語なわけだが。
> Rubyレベルで即値
アホか。
なぜ1 + 1で新しくオブジェクトが生成されているようなのに
インスタンス変数にさっきの値が入っているの?
即値だからさッてことを言いたいんでしょ
取り敢えず事の発端は
>>815 が変なこといったからであって、
別に即値の振る舞いが参照じゃないからって、変数は箱だッて確定するわけじゃないんだし
ここらへんで平行線でおわらせましょうよ
そんなことよりRubyに文字コード指定せずに、以下のコードを実行してみてよ
s = 'ぬるぽ'
p [s.intern, s]
>なぜ1 + 1で新しくオブジェクトが生成されているようなのに >インスタンス変数にさっきの値が入っているの? >即値だからさッてことを言いたいんでしょ インスタンス変数にさっきの値が入っているからこそ参照なんじゃないのかね。
>>887 > そんなことよりRubyに文字コード指定せずに、以下のコードを実行してみてよ
実行してみたが、何を言いたいのかまったくわからん。
ツマリコウシテホシインダロ
( ・∀・). | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' . V`Д´)/
(_フ彡 / ←
>>887
>>868 Rubyって、こういう実装内部までに言及する本や議論が
多いみたいだけど、なんで?
泥臭いだけでほとんど意味ないと思うけど。
>>891 勉強できる機会だし。
日本語で質問できるし。
もったいないじゃん。
>>891 組み込みや拡張ライブラリを書くときの助けになる。
>>894 面白いから、だけではダメですか。
というか、RHG以外に実装関係の本って出てるっけ?
RHGはそのための本だし、実装について説明したのはRuby本の8〜9章くらいだろ。
896 :
デフォルトの名無しさん :03/09/01 19:08
Rubyによるウェブサーバーの実装ってありますか?
>>897 ありがととぉぉぉぉぉぉぉぉおおおおぉおぉぉぉぉぉぉいfjxofsaifuusfuuうぅぅぅうう!!!
テンキュー
1.8にしたら Range#length が無くなってんだけど、どこやした?
% ruby -e'p((Object .. Class).length)' 0 これってなんか意味あったの?
>>896 ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port=>8080,:DocumentRoot=>".").start'
おそらく、変数 v がオブジェクト o への参照であるというのは、 value(v) = o を満たす写像 value: 変数→オブジェクト が 実行時の各時点で存在するってことだろ。 で、シンボルで識別されてスコープを持つ写像のことは 我々が生活において事物を指示する際の呼称との類似性から 単に「名前」と呼ぼうや、というのは計算機屋の 割とありふれた言葉遣いだと思うが。 DNSだのファイルシステムだのがその例。 名前の集合の構造のことを名前空間なんていうわけだし。 箱という暗喩は、その箱の中に写像に相当するもののみを ちょうど一つだけ収めらると考える場合には合法だが 箱の難点は空という状態を想起させる点にあるだろう。 しかし、いずれにせよ即値はRuby言語レベルの変数概念と関係ない。 関係あるのは実装言語のセマンティクスでオブジェクトを表現するとき。
どれがいいか迷ったけどWEBrickがいいんですかぁ テンキュー
>>902 > それにしても1.8.0変更点のページが散乱してて
> どれをメインに読めばいいのかわからんじゃねーか。
そんなの探さなくてもたいていリファレンス本体に変更点が書いてある
refe r len
Range#length
--- length
--- size
範囲の長さを返します。
始点と終端が Integer のインスタンスなら
(last - first + (exclude_end? ? 0 : 1))
です。それ以外では、each が実行され範囲の長さを数えます。
ruby 1.7 feature: length, size メソッドはなくなりました。
必要なら
p ("a" .. "z").to_a.size
=> 26
などとする必要があります。
ActiveScriptRubyを使って、htmlで document.onkeydown を使うにはどうすれば良いでしょうか。
>>906 ホンマや。書いてあった。
でも、refe だと情報が古いって感覚があるんだよな。
実際 Dir#path とか載ってないし。
cronとかで常に最新のデータベースを作るようにできないかな。
Dir#path ってなに?
あぁ、1.8 にはあるのか。
Rubyで作ったクラスのインスタンスを、拡張ライブラリでnewするにはどうすればいいの? class Hoge; end hoge = Hoge.new <- これ NEWOBJとOBJSETUPを使う? わけないよねぇ。 まさかrb_eval_string?
>>911 自己レス
hoge = rb_funcall(rb_iv_get(rb_cObject, "Hoge"), rb_intern("new"), 0);
で行けた。
cHoge = rb_const_get(rb_cObject, rb_intern("Hoge")); iHoge = rb_class_new_instance(0, 0, cHoge); 俺はこんな風に書いてたけど、間違ってんのかな?
>>913 すっごく正しそうです。
自分で書いてて、rb_iv_get(rb_cObject, "Hoge")でHogeクラスが取得できたけど、
なんでかわけ分かんなかったです。
ありがとうございます! ^^
rb_path2class("Hoge")ってのもある。いくらでも階層をかける優れもの …だが、動作は遅い実際に使う時は値を保存して使うこと。
ruby-dev 1548->1550->1552 ワロタ
組み込みについて教えてください。 たとえば自作のエディタにRubyを組み込んだとして ExecuteRubyMacro("Editor.CurrentDoc.Lines[3] = ''"); // 三行目をクリアするマクロ というメソッドを実装するにはどうすればいいのでしょうか? Ruby側ではどういったクラスを定義してどういったAPI経由で情報をやり取りするのでしょうか? といった情報はどこかでまとまっていたりするでしょうか?
>>919 それが自分で判らないのなら、エディタは作れないと思うんだが。
Ruby本の9章とか読んでみそ。
921 :
デフォルトの名無しさん :03/09/05 18:52
コマンドの出力を取り込みたいのですが、 バッククォートを使わないでお手軽に取り込む事ってできるのでしょうか? 具体的には hoge = "/home/hoge" となどして ls hoge の結果などを取り込みたいのです。 open3を使わなきゃできないんですかね?
リダイレクト込みでsystemとか。
>>921 バッククォートが一番お手軽だと思うが。
> 具体的には
> hoge = "/home/hoge"
> となどして
> ls hoge
> の結果などを取り込みたいのです。
`ls #{hoge}`
ってことか?
> open3を使わなきゃできないんですかね?
stderrが必要かどうかによる。
>>922 ,923
さっそくのご返答ありがとうございます。
`ls #{hoge}`でできました。
式展開はてっきりダブルクォートのみだと思っていましたです・・・。
925 :
デフォルトの名無しさん :03/09/05 19:57
>>919 JedやVimにRuby組み込んだのがあるからそのソースを参考にするのがよいと思われ
class C def initialize var = 0 # ← ここ var= が呼ばれない end def var=(v) @var = v end def var @var end end p C.new.var #=> nil def initialize(var=0); end のとき、 var はローカル変数であるべきだけど 上記の場合、 self.var= にしなくても var= を呼んでくれてもいいんじゃないだろうか。
>>926 「上記の場合」の意味が分からん。どういう場合を想定してるの?
>>927 こういうことを言いたいのでは?
class C
attr_accessor :var
def hoge
var = 0 # self.var = 0 とみなして欲しい
end
end
祖先クラスで attr_accessor されてる事を考えたら、 おちおちローカル変数使えなくない? class C attr_accessor :var end class D < C def hoge var = 0 # self.var = 0 とみなして欲しい? end end
initialize 内に限らずローカル変数への代入とみなせるときは 常にローカル変数への代入として扱われるわけだが これは「インスタンス変数への代入なら @var 使えばいいじゃん。 だからローカル変数とみなしちゃうよ」という実装上の都合だろう
ruby -e 'p id ; id = 0 ; p id'
>>930 めんどくさかったので例示に attr_accessor 使っちゃったけど、
var=() がインスタンス変数への代入メソッドとは限らないわけで、
実装上の都合というのは、理由としてはちょっと違うような。
>>929 それは実装者やユーザが気をつければいい (というか気をつけるべきな) ので、
理由になんないような。
と思ったけど、
>>931 見たら妙に納得。
>>932 >var=() がインスタンス変数への代入メソッドとは限らないわけで、
だから、そういう事態は (少なくとも実装者には) まれだろうと思われてるから
解釈の優先度が ローカル変数>メソッド なんだろう。
「あんまりないだろうけど var=() というメソッドを明示的に呼びたいときは
ちょっと長くなるけど self をつけてメソッド呼び出しだというのを明示してね」
という実装上の都合だろう。
あるいは実運用上こっちの方が簡潔になるからという言語仕様上の都合か。
C の = と == みたいに、よく使うものほど短くあるべきだから。
>>931 のは
self.id=() が定義されていないからローカル変数になって当然でしょう。
「実装上の都合」とか「言語仕様上の都合」ってのはなんだか納得いかん。 が、『「var = 0」は「メソッド呼び出し」よりは「変数への代入」のように見える』、 つまり、『「変数への代入」と見做された方が「驚きが小さい」だろう』、 ってことならば納得できるかな。
実行効率向上のもたらす驚きは宣言かと ruby -e 'p [ id , id = id , id ]' ruby -e 'p [ a , a = a ]' ruby -e 'p [ a = a , a ]' ruby -e 'if false then a = 1 end ; p a'
「実装上の都合」じゃなくてただの仕様。
a=a+1
驚きの大きな仕様ですね。
そんなコードを書こうとするオマエラに大きな驚き
[ruby-list:33797] 変数の宣言
burn method=ビックリメソッド
burn かよ!
燃えるメソッド?
萌えメソッド
ローカル変数へのアクセスのたびにいちいち(Rubyだから動的=実行時に) メソッド検索するのは高コストだから。作者も言ってたじゃん。 仕様だなんだというのは後付けだろう。実装の都合と折り合いが付くね、という話。
メソッド検索で速度落ちるのが嫌なら 素直に静的型導入すりゃいいじゃん・・ 構文変な風にするより健全じゃないかねえ
bangとburnを間違えた
950 :
デフォルトの名無しさん :03/09/07 11:27
RubyでCGIを作ってます。 入力された文章を改行ごとに分けて配列にいれようと思いました。 そこで require "cgi" cgi = CGI.new datum = cgi.params["datum"][0] data_array = datum.split(/$/) としましたが、うまくいきません。 どうも、いろいろ試した結果、 datum.split(/$/)でうまく区切られてないようです。 どうすればいいでしょうか?
よくわからんが datum.split(/\n+/) じゃだめなのか?
>>950 まずデータを確かめたほうがいいかも。
p datum
として、中身をみてみそ。手がかりが掴めるかも。
今の状況を、もう一度説明すると、 テキストエリアに aaa bbb ccc と入力して["aaa","bbb","ccc"]を得るCGIを作ってます。 コマンドラインで再現するために、 echo "value=aaa\nbbb\nccc\n" | ruby test.rb としています。 これがまずいんでしょうか? いろいろやっても["aaanbbbncccn"] が返ってきます。 ちなみに toshi@bsd01> cat test.rb require "cgi" cgi = CGI.new src = cgi["value"] dst = src.split(/\n/) p dst です。
p cgi = CGI.new した方が状況がわかる echo "value=aaa%0abbb%0accc%0a" | ruby test.rb だとうまくいった
じゃあrubyの後継言語はruby=rubyということで
>>953 > echo "value=aaa\nbbb\nccc\n" | ruby test.rb
シェルが '\' を食ってる。テストのやりかたがおかしい。
これが原因だろ。 if STDIN.tty? STDERR.print( %|(offline mode: enter name=value pairs on standard input)\n| ) end readlines.join(' ').gsub(/\n/n, '')
>>958 誰もお前の使ってるシェルの話なんてしとらん。
>>959 うるせー馬鹿。腐ったシェル使ってる香具師は黙っとけ。
前から疑問に思っていたけど、ruby は、$_ のグローバル変数を 嫌っているのになんで $_ を採用しているんだろ? 1ライナーが書きやすいという perl の良い面を取り入れていると 考える人もいるかもしれないけど、これは perl ユーザーに 迎合していると考えられ、腐臭を放つ原因となっている。 今からでも遅くないので $_ を完全に廃止するべきでしょう。
んじゃ 1.9.x で obsolete warning つうことで。
> $_ 積極的に使わなければいーんじゃない?オレもワンライナー以外では使わないなあ。 完全になくすとすると、 % ruby -ne 'print $1 if ~/regexp/' みたいなのはどうなる?(nやpオプションが使えなくなる?)
use strict ならぬ require 'noperl' ライブラリを用意するってのは
965 :
デフォルトの名無しさん :03/09/08 02:53
>>961 まさに perl ユーザに迎合するため。
そしてそれは大失敗だったと後悔されている。
パーラーはrubyの文法どう思ってるのかね。
$_無いと困るなあ。俺、awkやsedが分からんからruby -ne使いまくりですよ。
rubyisms.pmに対抗してperlisms.rb作ろうぜ。
>>963 もちろん -n と -p も切り捨てるべきでしょう。
-n だの -p だの、また時には -ep "〜" と書いてしまい動かなかったりだの、
この2つのオプションは邪魔でしかない。
ruby -e 'ARGF.each{|line|print line if /regexp/ =~ line}'
の方が、よっぽどスラスラ書けるし読みやすい。拡張もしやすい。
>>968 使いまくっているなら、それを具体的に書こう。
もし、本当に何回も使っているのなら読みやすく書いたのを
コマンド化しておいた方がいい。
>>970 ・釣り
・ディベートしたがっている
・本気
のどれよ?
「$_ を完全に廃止するべき」とまで言うには、理由が弱すぎる。
"There's more than one way to do it" なんだから、
廃止した時のメリットを言ってもらわないと。
たとえば、
> ruby -e 'ARGF.each{|line|print line if /regexp/ =~ line}'
> の方が、よっぽどスラスラ書けるし読みやすい。拡張もしやすい。
っていうのは、あなたにとってそうだ、というだけだよね?
あなたが $_ を使わないのは自由なんだから。
972 :
デフォルトの名無しさん :03/09/08 12:14
1.8 はライブラリいろいろと入れてくれるのはいいけど、 その割に uconv や rdtool あたりは入ってないのね。 出てから言うのもなんだけど、一体どうなってんの
かっちょよくて色覚障害でも見やすいCSS作って送ってやれ。
ベタ塗りじゃあ全然宝石っぽくないって気はするけど、まあべつに
ああ、なるほど。 ルビーの赤のつもりだったのか>オフィシャル
>>969 おお、 rubyisms.pm なんてのがあるのか。 FreeBSD PORTS に入れてくれ〜!
>>971 もちろん、メリットはある。でも、話の流れがかわったし、
スレが終わりそうなんで書かない。
>>980 んじゃ、新スレで話を蒸し返すのでそのときはよろしく。
>>981 粘着キタ━━━━━━(゚∀゚)━━━━━━━!!!!!
男は黙って > ruby -anal -e
>>982 アナル イ━━━━━━(゚∀゚)━━━━━━━!!!!!
970がawkなんて使ったことないのは良くわかったが まあviで下2行を打ってみなさい 123,456,789 abc,def,ghi そしたら次は↓のように打ってみなさい :%!ruby -anl -e 'BEGIN{$;=","};puts $F[2]' 出来たかね?では次は君の番だ 同じことをやってみたまえ アナルなしでな!! 正直廃止したら元awk使いはperlに再移行するしかあるまい 途中で廃止するぐらいなら最初から対応すんな糞が!! とたまにrubyを思い出しながらperlを覚えなおすだろう
awkですむならawkでやればいいじゃん
アホか 全部Rubyでやってこそ華
とっととRubyでRuby作りなおせって感じ
Rava で JRuby 動かせ
991 :
デフォルトの名無しさん :03/09/09 01:07
CGIを作る時にチェックボックスなどの、同じ名前に複数の値が入るのを コマンド上で実行しようとすると、どういう風に書けばいいのでしょうか?
で、結局 $_ を廃止するメリットはなんなんだ?
994 :
デフォルトの名無しさん :03/09/09 03:28
Eclipse Project なんかは、ロゴマークのガイドラインなんかも作っていて
http://www.eclipse.org/artwork/main.html (漏れにはオープンソースでここまでやる理由はどこにあるんだと思ってしまうが)
何か世間的なブランドイメージを良くするためのマジックがあるのかどうなのか。
Ruby は言語への美意識はそうとうなもんだけど、アートワークに
関しては無頓着で、人は見た目から入るという特性を考えたら
もったいないのかもしれん。
ブランドマーケターを雇ったら Ruby の進化も速くなるだろうか。
>>994 へんてこりんな萌えキャラをイメージキャラにされるよりはそっちの方がなんぼかマシやね。
>>994 そこら辺はIBMが決めたんじゃないの。よく知らんけど。
Rubyはとりあえずruby.jp, ruby.orgドメイン買い取ったらお客さん3割増って気がするよ。
R
u
b
y
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。