1 :
デフォルトの名無しさん :
2007/03/23(金) 08:54:39 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
14歳からはじめるRubyインターネットプログラミング教室
ttp://www.amazon.co.jp/dp/4899771827/ > 第1章 Rubyってどんな言語?―Rubyのインストールから使い方まで
> 第2章 Rubyの文法を覚えよう!―基本構文からオブジェクト指向まで
> 第3章 インタラクティブなゲームに挑戦!―会話プログラムから学習型しりとりまで
> 第4章 CGIでWebプログラミングしよう!―超簡単!掲示板を作ろう
> 第5章 ERBで埋め込みスクリプティング!―思考型ゲーム「リバーシ」に挑戦!
> 第6章 データベースを使って本格Webアプリ作り!―オリジナル・ブログシステムを作る!
サンプルとしてしりとりを作るとこだけ立ち読みした
そういえばレシピブックが第二版になったよ
ttp://www.amazon.co.jp/dp/4797340045/
レシピブックは糞だから絶対買うな
前スレの話だけど if expr then result = A else result = B end return result なんて書くくらいなら俺は return A if expr return B って書くなぁ
あれは例として1行で代表して書いてるだけだろ? 実際はthen以下には数行の処理が入るはず なぜかインスタンス変数持ち出してる奴もいたがわけわからんな
Exceptionのある言語で出口一つに拘る意味があるのかね。
>>11 たくさんあるとわかりにくいだろ?
わかりやすいように記述しようとするのは悪いことでもなかろう
別に。それでわかりづらくなるようだったらおそらくそれは メソッドが長すぎると言うことだから、適当な単位に分轄するよ。
15 :
デフォルトの名無しさん :2007/03/25(日) 04:39:32
教えて、勉強し初めったばっかっす。 \nって改行だよね?なのに?nってなるんだけどなんで?
>>15 '¥n'とかやってないか? "¥n"とやればいいとおもう。
ほんと、勉強しはじめましたって感じの質問だ 俺も昔を思い出す、がんばれ
<<ってなんなんでしょうか?
リファレンスで見たら特異クラス定義らしいんですがどうもしっくりきません。
Googleで検索しようにも記号のせいでうまくいかず。
ttp://wota.jp/ac/?date=20060120 ここの
> # 持ち歌に加えると、group_id に反映される
> >> berryz.songs << song
の場所なんですが。
その << はActiveRecordとかいろいろ絡んでくるので一言では説明できないが、 本質的にはArray.pushだ。
「適当に足す」記号だと思って適当に使えばー という回答では充足しないだろうな なにがどうしっくりこないのよ << という記号全般の動作? ActiveRecordでの動作?
見付けた説明が特異クラス定義の構文に出てくる<<ゆえ、 「でもここは特異クラスの定義には見えないなぁ」 というのがしっくり来てない点と思われる。
「(1..10)の..って何メソッドですか?」というのと同じ問題か
Arrayのメソッドのとこには self << obj obj を配列の末尾に追加します。Array#push と同じ効果です。 ary = [1] ary << 2 p ary # [1, 2] と書いてあるな こっち見つければよかったのに
ケツにくっつけるという意味ではどれも一緒のような気もする
Net::HTTPRequestのマニュアル見ると > self[ key ] = val > key ヘッダフィールドに val をセットします。 key は大文字小文字を区別しません。 とか書いてあったので、村一番の素直な正直者で通ってる俺は Net::HTTP.new( server,port ) {|http| http[ 'If-Modified-Since' ] = 'Sun, 25 Mar 2007 02:18:22 GMT' response=http.get( path ) } と書いたら undefined method `[]=' for #<Net::HTTP pc11.2ch.net:80 open=false> (NoMethodError) というエラーが出ました 悲しいです マニュアルにもう少しわかりやすい例を増やしてください
レベル高めのスレにアホな質問で恐縮ですが… スキルはrubyプログラミング入門という本を買って、いま35頁目という程度です。 foo = [[1,2,3],[4,5,[6,7]]] 配列の要素に配列を含める事ができるという例で上の例があり、 puts()でどんな出方をするのか試してたんですが、 puts(foo[0][0][0])は存在しないからnilかエラー落ちを返すとおもってたら1を返されました。 存在しない時は一次元上のfoo[0][0]が返されるのかと考え、確認でこんどは puts(foo[1][1][1])でfoo[1][1]の5が帰ってくると思ってたら0が帰ってきました。 どういうルールでこんな結果が出るんでしょうか? まだ質問するようなレベルじゃないとは思っているのですが、すこし混乱してしまって… よろしくお願いします。
httpは Net::HTTPのインスタンスであって、 Net::HTTPRequestのインスタンスではないようだな。
>>27 p 1[0] #=> 1
p 1.to_s(2) #=> "1"
p 5[1] #=> 0
p 5.to_s(2) #=> "101"
>>27 puts は最終的にわかりきったものを見目良く表示するときにだけ使え
プログラム作成途中や不明不審なものを表示するときは p を使う
irbの使い方は知ってるか?
> foo = [[1,2,3],[4,5,[6,7]]]
=> [[1, 2, 3], [4, 5, [6, 7]]]
> p foo[0]
[1, 2, 3]
> p foo[0][0]
1
> p foo[0][0][0]
1
> p 1[0]
1
> p foo[1]
[4, 5, [6, 7]]
> p foo[1][1]
5
> p foo[1][1][1]
0
> p 5[1]
0
で、Integerの[ ]の説明
self[nth]
nth 番目のビット(最下位ビット(LSB)が 0 番目)が立っている時 1 を、そうでなければ 0 を返します。
>>27 foo[0][0][0] は foo[0][0] が 1 なので 1[0] => 1
foo[1][1][1] は foo[1][1] が 5 なので 5[1] => 0
何を返しているかというと、二進数で表したときの、指定した桁のビット。
33 :
27 :2007/03/25(日) 15:49:49
ええと、
数字の配列表記の場合、要素の次元より下を指定した場合は、
数字自体に対してのビット表記での桁位置指定として解釈される…って事でいいんでしょうか?
>>30 irbというのは初耳です。ぐぐってみたら昔のBASICみたいなリアルタイムの実行環境
で合ってますでしょうか?
いまは始めたばかりで量も少ないので、テキストファイル作ってdosプロンプトで
ruby "hoge.rb"とかちまちましてます。
>>32 Rubyにはまず多次元配列というものは標準では存在しない。
foo[0][0][0]というのは3次元配列へのアクセスの記法ではなく、
x = foo[0]
y = x[0]
z = y[0]
と順次呼ばれていっている途中の変数を省いた記法にすぎない。
yがたまたま整数であれば、整数に対して[]というメソッドが呼ばれている。
35 :
27 :2007/03/25(日) 16:08:32
>>34 なるほど氷解しました。
そもそも foo = [[1,2,3],[4,5,[6,7]]]の構造がいまいちわからなかったので
表示テストしてたのですが、1次元で芋づる式だったらなんでもありな
構造ができますね。
ありがとうございました。
出口が一つの方がわかりやすいなんてのは迷信。
37 :
デフォルトの名無しさん :2007/03/25(日) 20:14:44
Cygwinなんですが、自分で作ったrubyのライブラリ的な.rbファイルを、いつでもどこでもrequireするには、どこに置く流儀がベストなんでしょう?
$: の中にsite-rubyという部分を含むパスがあればそこへ。 cygwin版で具体的にどこになるのかわからんけど。
39 :
37 :2007/03/25(日) 20:46:05
>>38 ありました。ありました。
p $: #=> ["/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", "."]
って感じです。
今のところ/usr/libは空っぽなので、/usr/lib/ruby/site_rubyを作ってここに入れたいと思います。
ありがとうございました!
# 1つ気になったのですが、普段使われる標準ライブラリは/lib/ruby/1.8に入っていて、$:の中にないのに、なぜかちゃんと使えるみたいです。
>>26 Net::HTTP.new( server,port ) {|http|
response=http.request_get(path){|req|
req[ 'If-Modified-Since' ] = 'Sun, 25 Mar 2007 02:18:22 GMT'
}
}
>>41 /usr/lib/ruby/1.8/net/http.rbの724行目くらいから
>>39 おれは ~/lib/site_ruby とか作って、環境変数 RUBYLIB に設定している。
44 :
デフォルトの名無しさん :2007/03/25(日) 23:27:46
def swap(a,b) temp = a a = b b = temp end a = 10 b = 5 swap(a,b) p a why?
a, b = b, a でいい
Rubyはマニュアルが整備不足だよね(´・ω・`) ソースを自分で調べて使わないといけないよね(´・ω・`)
47 :
デフォルトの名無しさん :2007/03/25(日) 23:53:55
>>47 p aで10が出力される理由なら、a = 10ってやって以来、このスコープのaの値を一度も変更していないからだが。
swapって書いてあるから必死でobjectIDの説明プログラム書いてたんだが よく考えるとこれそれ以前だよな
>>48 自作関数のswapで変更してる気がしますが
2.6 仮引数に代入すると実引数に影響を及ぼしますか 仮引数は、ローカル変数であり、仮引数に代入を行うと他のオブジェクトを指すようになるだけで、 元の実引数のオブジェクトには何の影響もありません。
>>50 def hoge(a,b)
puts 'hogeに持ち込んだaは',a,'hogeに持ち込んだbは',b
a=1
b=2
puts 'hoge内で変更したaは',a,'hoge内で変更したbは',b
end
a=10
b=5
hoge(a,b)
puts 'hogeが終わってaは',a,'hogeが終わってbは',b
----
実行結果
hogeに持ち込んだaは
10
hogeに持ち込んだbは
5
hoge内で変更したaは
1
hoge内で変更したbは
2
hogeが終わってaは
10
hogeが終わってbは
5
def foooo(a,b,c) の a や b や c は def の外の a や b や c とは完全に別なんだよね def の「外」に影響を与えたい場合は ・ returnで値を返させてそれを代入 ・ @つきのインスタンス変数とか使う どっちかにしとけ 前者はわかりやすいが変数が多くなりがちで格好悪い 後者はスマートだがどこで値が変化してるんだかわかりにくくなりがち
メソッド間の値の受け渡しのためだけに大域変数使うなよ
完全に別というのはどうかと irb(main):001:0> str = "foo" => "foo" irb(main):002:0> def poo(s); s.replace("bar"); end => nil irb(main):003:0> poo(str) => "bar" irb(main):004:0> str => "bar"
>>56 その例でも、「poo内のs」と「poo外のs」は、完全に別だからねぇ。
>>56 取り敢えずRubyの変数がどういうものかもう一度やりなおしですよ、その理解だと。
Rubyの変数は名札と紐みたいなもので紐の先にオブジェクトが結びついているイメージです。
んでdefの内部(パラメータも含めて)において定義される変数はその内部でしか通用しない名札を与えられます。
そして定義されたメソッドに渡されるパラメータは変数ではなく、
変数の先にぶら下がっているオブジェクトなのです。
そのオブジェクトに対し破壊的メソッド(String#replaceなど)を適用すると、
当然そのオブジェクトは変わります。
同じオブジェクトをぶら下げている変数(str)も当然ですが変わったように見えます。
俺は45=51=52=56だが、「完全に別」と言う表現の認識に差異があっただけで 「もう一度やりなおし」とまでいわれる筋合いはないな。 まだソース1/10くらいしか読んでないし未熟なのは間違いないけど
ソースって何のソース? Rubyのソースを読んでいて変数が参照であることを理解できてないっていうの? それはおかしい。知ったかぶりするにしてもすぐにバレる嘘をつくなよ。
変数が参照であることは理解してるよ。元の本題は def foo(n); n = 10; end num = 0; foo(num); p num #=>0 の挙動の説明だろ。 Java や Python は Ruby と同じ挙動を示すけど、 C++ だと int foo(int &n) { n = 10 } int num = 0; foo(num); cout << num #=>10 Perl だと sub foo { $_[0] = 10 } my $num = 0; foo($num); print $num #=>10 そういう言語からきた人にとっては仮引数に代入して実引数に 影響を及ぼさないのは不自然だと感じられるんじゃないの?
うげげ、C++の例が酷いことになってる void foo(int &n) { n = 10; } int num = 0; foo(num); cout << num; //=>10
>>61 ?? なんでC++の例で勝手に仮引数を参照で受けるようにしちゃうのさ。
そもそもC++でだって
int foo(int n) { n = 10; }
という例もあるんだし、この例で考えれば自然じゃないの。
C++からきた人が不自然に感じられるなんてわけないでしょ。
せいぜいどっち? ってはなしになるわけで(で、Rubyの場合はどっちでもないんだけど)。
というかそういう話だったの? C++で参照で受けてたのと動きが違うんですけど、
なんて話じゃなかったでしょうが。
少なくとも
>>44 がやりたがってたのはそういうことだと俺は読み取ったんだけど
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int a = 10;
int b = 5;
swap(a,b);
cout << a << b; //=> 5 10
>>64 あ、そうか。確かにそうだな。おれのエスパー度が足りなかったようだ。
そこまで言われて理解できた。絡んですまんかった。
心の贅肉が、彼にエスパー度なる新語を造らせてしまうのだった。
すみませんExerbについての質問、ここでいいでしょうか。 wxrubyでGUIアプリを作っています。htmlヘルプを用意して、 GUIからヘルプウインドウを呼び出せるようにしたのですが、 Exerbでexe化するとコケてしまいます。 Rubyスクリプトからは次のような設定ファイルを呼びだす形 になっており、このファイル自体は呼び出せてるものの、 そこに記載されたファイルにアクセスできてないみたいです。 [app1.hhp] Contents file=app1.hhc Index file=app1.hhk Title=app1 Default topic=index.html この段階での挙動はRubyからコントロールできない(バイナリ?) と思うのですが、何か可能性のある打開策があればご教示ください。 お願いします。
> この段階での挙動はRubyからコントロールできない この意図が解んないkwsk あとエラーコードも無いと判断できない
69 :
デフォルトの名無しさん :2007/03/26(月) 10:02:59
67です。 >> この段階での挙動はRubyからコントロールできない > この意図が解んないkwsk wxruby2.soのAPIからはヘルプの設定ファイルの読み込みに ついて指定するというのはできないみたいなんです。 wxruby自体C++によるライブラリのswigによるバインディング に過ぎないですし。 > あとエラーコードも無いと判断できない 普通にRubyスクリプトとして動かすとエラーは出ないんですが、 exeファイルからヘルプを呼んだときにはC++ Runtime Error という大して役に立ちそうもないメッセージダイアログが出ます・・・。
>>44 誰も言わないから言うけど、
a, b = b, a
で交換できると思う。メソッドこさえなくても。
45の立場はいったい
>>71 >>45 がさりげないから(というか以後が熱くて)見逃した。
吊ってくる。
>>69 htmlヘルプをフルパスで指定している?
相対パスだとうまく行かないと思うけど
75 :
18 :2007/03/27(火) 14:08:10
レスくれたかた、ありがとうございました。 とりあえずArray.pushだと認識しておくことにします。
Cレベルで定義を見ると、 push == 各引数に対して<<を呼ぶ。 という形だな。 pushは複数を追加できるが、<<は1つだけ。 $ irb irb(main):001:0> a=[] => [] irb(main):002:0> a.push(1) => [1] irb(main):003:0> a.push(1,2) => [1, 1, 2] irb(main):004:0> a.push([1,2]) => [1, 1, 2, [1, 2]] irb(main):005:0> a.push(*[1,2]) => [1, 1, 2, [1, 2], 1, 2] irb(main):006:0> a << 1 => [1, 1, 2, [1, 2], 1, 2, 1] irb(main):007:0> a << [1,2] => [1, 1, 2, [1, 2], 1, 2, 1, [1, 2]]
>>75 今更だが、少なくともArray.<<はプッシュということはソースからもうかがえる
http://svn.ruby-lang.org/repos/ruby/trunk/array.c 2980: rb_define_method(rb_cArray, "<<", rb_ary_push, 1);
2981: rb_define_method(rb_cArray, "push", rb_ary_push_m, -1);
Array.<<はrb_ary_pushで、Array.pushはrb_ary_push_mだと定義してる
0453: rb_ary_push(VALUE ary, VALUE item)
0454: {
0455: rb_ary_store(ary, RARRAY_LEN(ary), item);
0456: return ary;
0457: }
0473: rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
0474: {
0475: while (argc--) {
0476: rb_ary_push(ary, *argv++);
0477: }
0478: return ary;
0479: }
つまり、Array.pushは内部でArray.<<を呼んでいる
両者は引数の取り方が違うだけで同じもの
あ、76が答えてたな
>>75 >>77 そこはArray#push、Array#<<と言おうぜ
Array.pushだとクラスメソッドだ。
同じも何もマニュアルに書いてあるな マニュアルすら読まん奴はそうやって無駄に時間使う
いや、元質問者
>>18 はちゃんとリファレンスを読んでるぞ。
ただ、特異クラス定義の<<だけしか見付けられずにはまっていたわけで。
マニュアル読めというのは、初心者が読んでもわかるようなマニュアルを用意してから言ってくれ。
すごま(だっけ?)をヲチするとか参加するとか
馬鹿な! 初心者にもわかりやすいオンラインマニュアルなんか用意したら解説本が売れないじゃないか!
んと、自前の小さなプログラムなんだが、初期設定がいっちょまえにあるんだ。 で、その初期設定を格納するには、 1.各値をグローバル定数 2.各値をグローバル変数 3.各値を"初期設定"ってクラスのインスタンスの中の定数 のどれが理想的なんだろう。 Rubyっつうよりプログラマ初心者で申し訳ないが。。
ん… 1.定数 2.グローバル変数 3.初期設定をまとめたクラスのインスタンス変数(読み出しのみの指定) の三つ、と表記すべきでした。すいません。
確か添削のTropyの回にそんな話があったよね。
>89 ほほう?もう少しkwsk教えてくれ。
うーむ、そこそこ検索したが見つからぬ。もちょっとヒント希望。
"るびま"でぐぐれ RubyのWeb雑誌で、その中に公募したコードを添削する企画がある
つーか初心者はまずマニュアルをよく読んで、理解できるまで勉強すべき。 いきなり英語読み書きするのは厳しいのと同じ。まずは英語の勉強しないと。
rubyを覚えたい訳じゃなくて、やりたいことがあってそれでrubyを使うだけだからな。 どこに自分の知りたい情報があるのか知っておくために、 軽く目を通しておいたほうがいいと思うが>マニュアル
だからそういうのは初心者が読んでもわかるようなマニュアルを用意してから言え。
97 :
89 :2007/03/28(水) 10:44:16
初心者だし、まだ応用が効かないのよ。 他の人のソースを見て勉強するだけのスキルもまだ無いし。 実際のところ、マニュアルだけで全て解決できる人間なんて居ないだろう。 実例とサンプルプログラムじゃ山と谷ほどの差があるのに。 正当化するわけじゃないけど、こうやってヒントをもらうと探索範囲が増えるので、 くだらない質問が減ることは間違いないと思うんだが。 ともかくも、ヒントくれて本当にありがとう。
初心者ならまず本でも読んだ方がいいと思うよ。 いきなり英語辞典読んでも文法知らないと無理なんだし。 というわけで、初心者が理解できたルビー本はどれ?
>>98 俺は「楽しいRuby」だった、というかそれしか無かった。
CのHelloWorldレベルだけど何とかなったよ、
でもクラスが登場するあたりは、ちょっと辛かったかも
結城浩氏は「Rubyプログラミングレッスン」を書かないのかな。
レシピブックまで読めたら、あとはWebで適当に調べれば良いのでは?
レシピだけじゃ料理作れない香具師もいる訳で。 片っ端から本読んで知識つけるしかないね。 マニュアルというより、具体的な事例のチュートリアルが充実すると良い感じ。
おまいらデバックフラグどう記述してる? Cでいうところの#define DEBUG 1みたいなの。
それはデバックモードのフラグな。 おまいらpデバックしないの? デバックで使ったpをいちいちコメントアウトするの面倒じゃん。
DEBUG と書きつつデバッ「ク」なのが気になる
>> 106 p hoge if $DEBUG じゃダメなの?
Perlの @hash{'inu', 'neko'} = ('dog', 'cat'); みたいなことはできないのですか?
キー:値ペアをまとめて追加する方法は、 hash.merge!('inu' => 'dog', 'neko' => 'cat') #merge! == update くらいかねぇ。
本日Ruby始めました。perlはちょっとだけできます。eucファイルを読み込むなどはなんとか出来ました。 ファイルを読込み後、クラス変数などに格納したいです。 ファイルの内容は、 --20070305 x1 x2 --20070306 y1 y2 のような内容です。日付と、複数行をセットにして配列か何かに持ちたいです。特に複数行どうやって保持するんでしょう。 ググったのですが、見つからない。 なにかよいサイトなどあれば教えてください。
>>111 「複数行保持」って言うのは
例えば一行一行を別けて配列の要素にして保持したいって事?
>>111 {"20070305" => ["x1", "", "x2" ]}
みたいにHashのkeyを日付に、valueを各行の要素からなるArrayにすれば?
hash = Hash.new
date = "20070305"
hash[date] = Array.new
hash[date][0] = "x1"
hash[date][1] = "x2"
hash[date][2] = ""
なにをしたいのかわからん ファイルは1個で区切りが「--8桁日付」で、データを 20070305は 「x1 x2 」 で 20070305は 「y1 y2」 というようなペアで保持したいということ? ファイルをFile.readして全部読み込んで正規表現でscanして {日付 => データ,日付 => データ, ... } というハッシュにするのがよろしかと file=File.read(ファイル) pairs=Hash.new # --の次に数字8桁でお約束改行が1個あってたくさん文字があり # 直後に--かデータ末が見えるまでマッチする正規表現↓ file.scan(/--(\d{8}).(.+?)(?=(?:--|\Z))/me){ pairs[$1]=$2 } pairs.each do |key,value| puts "キーは"+key+"で"+"値は"+value+"です" end
また小難しい正規表現を -- という2連ハイフンがデータの中に絶対現れないのなら splited=file.split(/--/) splited.each do |text| text=~/(\A(\d{8}).(.+)\Z)/ pairs[$1]=$2 end
おまいら、今日はじめたという奴にそんな小難しい内容を……
そもそものファイルのデータ構造が小難しいんだよな 自力でPerlでやってできないというのなら、まだ難しいかもしれん
とりあえず p の使い方覚えることだろな puts を使って表示させて確認してるうちは 成功してるんだか失敗してるんだかよくわからんはずだ
独自データ構造使っていいことは何もない。 XMLやYAML使っとけ。
>>119 ファイル書式を選べるかどうかも分からないのに、
あくまで練習としてこの書式を読むことに挑戦しているかもしれないのに、
そんなこといっちゃいけないよ。
みなさま、ご協力ありがとうございます。 GUIのアプリケーションなどで汎用的に使用しようかなと思っています。 リストボックスを選択したときにその複数行の内容を取得してマルチテキストなどに読込む、といったもの。 じっくりゆっくりやってみます。 今日は、if文のあとに括弧とかthenとかないのを見て、へー、ってな感じ。
>121 then は書くことも出来るけどな 俺は then や do は基本的に書く派
>>115 text=~/(\A(\d{8}).(.+)\Z)/m
thenは書かないとifやwhenの条件が終わったことが目視できないから書く
改行を区切りにするのはどうにも不安だ
同様にreturnも絶対書く
sort_by! ってなんで無いの?
Enumerableモジュールはオブジェクトの実装を知らないので破壊的操作をできない。
ふむ。じゃあ Array#sort_by! も無いのはなんでなのかな?
無いなら作ればいいじゃない
>>126 Array#sort_byがないのと同じ理由だろ。
破壊的メソッドのメリットの一つとして、新たに領域を確保しなくていいってのがあるけど sort_by だと結果とは別にブロックの評価結果を保存するために O(n) サイズの領域を使うからsort_by!を作ってもメリットが少ないと踏んだのかな?
たぶんね 要領よくソートさせるためにはどーしてもデータを大量あるいは全部コピーする必要があるんで 「破壊的動作のように見せかけるためにわざわざ書き戻す」とか アホくさい動作にしなければならんのでやめたのだろう
正規表現 =~ 文字列 文字列 =~ 正規表現 どちらでも良いということですが、使い分けたりするんですか? 他にも全く同じ意味のメソッドが複数あったりするようなのですが、何故そういう仕様なんでしょうか。
マッチを行うなら、最初から左辺が正規表現のものを書いた方が Ruby的には素直。 文字列 =~ 右辺 の場合、右辺には他の型も書ける。 右辺が文字列だと、エラー。(1.7までは正規表現が書かれていると見なして 処理) 右辺が正規表現だと正規表現 ~= 文字列 (rb_reg_match)。 右辺がその他の型だと、右辺 =~ 文字列を行う。 同一動作のメソッドがあるのはそういうものとしか言いようがない。 慣れた名前のほう/文脈によりふさわしいほうをどうぞ。 Perlにもgrepとmapみたいなのあるな。
>>131 RubyとしてはRegexpのメソッドである前者の =~ を使うのが「Rubyらしい」
後者はPerlなどでよく使われるので利便性のために正規表現のマッチとしても動作するようにしてあるだけ
同じ意味のがたくさんあるのは
・ させたい動作に対するコトバの意味で使い分けてみる
・ どっかの言語で使われていたイディオムをRubyでも使えると楽しい
これくらいの意味しかない
「普通は使わんメソッドや文法」というのはあるが、基本的にはどれを使って好きに書いてもいい
なるほど。確かにアホくさいので用意しなかったというのはありそうですね。 ただ、対称性ということでいうと、 たとえアホくさい動作になっても用意しといて欲しい気はします。 破壊的メソッドは非破壊的メソッドより効率良くなければならないという法はないですよね。
135 :
デフォルトの名無しさん :2007/03/30(金) 14:06:39
配列にのそれぞれの要素の「数値」部分を元に ソートさせるコード書いたんですが、こんなヘボしか思いつきません。誰か助けて。 a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f'] sa = a.sort{|a,b| a[/\d+/].to_i <=> b[/\d+/].to_i } sa.each{|v| print v, ' ' }
ヘボもなにも、それが正答だと思うけど。 あ、3行目は print sa.join(' ') の方がいいね
別にそんなんでもいいんじゃね 俺なら配列にしてそういう比較をすること自体が何かマズいと考えて全体を作り直したいけど まあそういうのって面倒だしな
138 :
デフォルトの名無しさん :2007/03/30(金) 14:21:03
他の言語のソース中から、 Version = '1.1.1'; の、バージョン番号名を抜き出したいのですが、 def get_version s = IO.read "hogehoge.pas" /Version\s*=\s*'([\d.]+)'/ =~ s $1 end のような感じでよいのでしょうか? 正規表現で、切り出すのに、慣れてないのですが、こんな感じでよいの? 一応、ちゃんと動いているようですが
>>136-137 あ、そうなんですか…
いや、いつも自分で書いたコードより
簡潔に表現されてるコードがあるもので。
今回は問題無かったみたいでよかったです。失礼しますた。
>>138 def get_version
file = File.read('hogehoge.pas')
return file.scan(/Version\s*=\s*'([\d\.]+)';/).to_s
end
たいしてかわらんな
抜き出すのはscanじゃないほうがいいのかねえ
>>139 要素数が5個程度だからそれでOKとは書いたけど、
これが数万とかのオーダーになったり、
何度も何度もソートするようなコードであればまた答は別よw
さすがに比較時に正規表現で取り出して整数に変換なんてのをやってるのは、
要素数が多くなってくると効率が悪すぎる。
そこで sort_by! ですよ。(嘘)
>>141 確かに。
ただ今回は多くても数百くらいですので、これで無問題ですよね?
sort_byとか言ってる香具師は素人
>>143 うん、多分無問題だと思う。
パフォーマンスに問題が出たら、そこを真っ先に疑うがよいw
irb(main):001:0> "hoge".delete("o") => "hge" irb(main):002:0> ["h", "o", "g", "e"].delete("o") => "o" 対称じゃなくてキモい。
そういうのを対称というのか?
統一性?
一貫性?
どっちかってえと irb> s="hoge" => "hoge" irb> s.delete("o") => "hge" irb> s => "hoge" irb> a=["h", "o", "g", "e"] => ["h", "o", "g", "e"] irb> a.delete("o") => "o" irb> a => ["h", "g", "e"] これのほうが直感に反してて困る
152 :
デフォルトの名無しさん :2007/03/30(金) 16:28:46
みなさんRubyでどんなスクリプト書いてますか? 自分はちょっとしたファイル加工とか、CGIとかにしか使ってません。 まぁプログラミング言語なんて使い分けるのが当たり前かもしれませんけど。
153 :
デフォルトの名無しさん :2007/03/30(金) 16:50:30
>>152 ・ちょっとした小物(shellスクリプトでやるようなのも全部Rubyで)
・HTMLから、RSS生成したり
・他小物CGI
PC使う際の「手足」に使ってる 聞いてどうするんだという気はせんでもないが
なんかRubyで書かれた実用的なソフトってあんの? いまんとこレイルズくらい?
156 :
デフォルトの名無しさん :2007/03/30(金) 17:23:38
>>153 う〜ん、やっぱり用途が似てますね…
自分の場合、大きな物作らないから
いつまで経っても、Rubyはスキルアップしないですねえ…
言語仕様も色々と機能が豊富みたいなんですけど
作るスクリプトが小物なんで、使うまでもない物が殆どなんですよ。
>>154 手元に置いて、便利に使える道具的な使い方が多いですよね。
みんな一番大きなのでどの位の規模の作ったのあります?
自分はせいぜい、2000ステップくらいのCGIですね…
USBメモリなどにrubyをに入れて rubyのインストールされてない環境で実行したいんですが それは可能ですか?
>>159 Winなら、Exerbとかruby2exeとかで
バイナリにする方法もあるよ。
700ステップくらい しかしメソッドチェーンやワンライナ多用だから指標になるのだろうか…
つーか、ステップの数え方は?
163 :
158 :2007/03/30(金) 17:39:15
>>162 自分は、空白、コメント等もすべて入れてです。
HTMLもコード中に埋め込んでる様な汚い物なんで
純粋なRubyのコードだけでいうと半分くらいしかないと思いますけど。
164 :
159 :2007/03/30(金) 17:41:18
>>160 素早い回答ありがとうございます
えっと バイナリにするのではなく
ruby環境を持ち運んで 別PCで開発&実行ということは可能でしょうか
星野真里のファンは誰だよww
>>163 ERbLightとかでhtmlを外部ファイルにするとかなり楽になるよ
167 :
デフォルトの名無しさん :2007/03/30(金) 17:43:16
>>152 あと、
・でかいプロジェクトのRakefile
素のmake使えなさすぎ
>>159 USBストレージにいれて動かしている。とりあえず、パスさえ通せば使えるはず。
rubyスクリプトを動かしたいだけなら、ruby2exeとか、exerbで。
ステップで物数えんな
>>166 確かにHTMLは外部にしなきゃダメだとつくづく思います…
そうしないと、もうRubyのコードとは思えない程汚いです。
>>168 メソッド数がある程度目安になると思う
適宜メソッドに分けることのできる人はそれなりにそれなりだから
読み込んで処理して整形して吐き出すCGIなのにメソッド3個とか眩暈がする
>>135 これこそsort_byを使うべきところじゃね?
a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
p a.sort_by {|s| s[/¥d+/].to_i} #=> ["f0f", "f1f", "f2f", "f3f", "f10f"]
135のやり方だと効率云々よりも a[/¥d+/] と b[/¥d+/] と同じことを2回書いてるから美しくない。
thenの中が4行以上ならメソッドに分ける
俺の場合は同じ処理が二回以上出てきたらメソッドにまとめるって感じだな… まあ小物ばっかりなんで
>>173 お前か
引数5個で中身6行のメソッドとか平気で作ってるの
自分の場合は完全に感覚だな… 削除処理だからそれをメソッド 表示処理だからそれをメソッド まぁあまり一つのメソッドに詰め込みすぎるのはよくないよね。
意味のある名前のつけられそうな処理だったらメソッドにする
モジュール作るの積み木とかパズルみたいで楽しいよね
ぜんぶくらすだからもじゅーるとかわかんない
で?
if文の条件式が長くなって困ってる。 Javaなんかはセミコロン打つまでいくらでも改行できるんだが Rubyではどうやんの? if visible==1 and visit_count==10 and ( s_member_id==1 or s_member_id==5 or s_member_id==9 ) disable = 1 end みたいな場合。 下らん質問で申し訳ない。調べたけど案外見つけられなくて聞いてみる。 まだ探し回ってるから時々見に来ますんでよろしくです。。。
andの後ろみたいな、明らかに式が続くことが分かる箇所では 自由に改行可能。 そうでない箇所で改行する場合は改行前に ¥ を入れておく。
>>184 d。できますた。
and / or 前置き派なのでハマっていたのでした。
あるいは\ね。メモメモ
> 明らかに式が続くことが分かる箇所 へえ
>183 catch(:hoge) do throw(:hoge) unless visible == 1 throw(:hoge) unless visit_count == 10 throw(:hoge) unless [1,5,9].include?(s_member_id) disable = 1 end
>>182 破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
久々にひどい半可通を見た
self.unpack('C*').map{|c|c^42}.pack('C*')
ところで必ずreturn書く人に聴きたいんだけど、ブロックの戻り値ってどうやってます? 最近WindowsのGUIフレームワークを書き始めたんだけど、イベントリスナをブロック で登録できるようにしてるんだが、ブロックから値を戻すときに、returnと書くと、 LongJumpErrorとか出るんだけど。 ブロックをreturnで戻ることはできないのかなぁ。
>>187 こんな書き方はじめてみた。
すごいのかわかりにくいのかなぞだ
>>191 さんくすこ。メモリは数倍食うけどこっちの方が速いみたいっすね。
>>188 >破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
あははは!sortとsort_byでベンチマークとって、自分でたしかめな。
つ、つられないぞ!
197 :
デフォルトの名無しさん :2007/03/31(土) 05:50:40
>>140 scanってのがあるんですね。
参考になりました。
>>177 俺もその感じ。
コメントつけるところで、むしろメソッド化
でも、Rubyだと、小物多いから、ずらって、書いちゃうことも多い
198 :
187 :2007/03/31(土) 06:05:37
>>193 def hoge
return unless @visible == 1
return unless @visit_count == 10
return unless [1
5
9].include?(@s_member_id)
@disable = 1
end
begin
break unless visible == 1
break unless visit_count == 10
break unless [1
5
9].include?(s_member_id)
disable = 1
end while(false)
>>192 メソッドの戻り値はreturnをつかうけど、ブロックの戻り値はreturnを使わない。後者は挙動が違うし。
メソッドとブロックを同じにしなきゃいけないという理由はない。
>>195 あははは!お前こそベンチマークとって、自分でたしかめな。
% time ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }' 11.40s user 0.01s system 99% cpu 11.520 total
% time ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }'
ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }' 15.58s user 0.00s system 97% cpu 15.922 total
3 個でソートはちょっと・・・。 しかも、ソート列をまたソートさせるのも・・・。 $ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}' real 0m0.950s user 0m0.942s sys 0m0.007s $ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort_by{|a|a}}' real 0m0.208s user 0m0.201s sys 0m0.007s
>>200 require 'benchmark'
include Benchmark
a = (1..10000).map {rand(10000)}
bm(10) do |b|
b.report("Sort") { a.sort {|x,y| x<=>y} }
b.report("Sort!") { a.sort! {|x,y| x<=>y} }
b.report("Sort by") { a.sort_by {|x| x} }
end
user system total real
Sort 1.021000 0.000000 1.021000 ( 1.142000)
Sort! 1.052000 0.000000 1.052000 ( 1.091000)
Sort by 0.070000 0.000000 0.070000 ( 0.080000)
破壊的メソッド「だから」動作が速いという理屈にはならない
単純にどれかが最強というようには決められないのがsort
sort と sort! だと sort! の方が速いじゃん? ごく僅かだが。
>>202 sort と sort! を比較するなら a は毎回初期化すべきじゃない?
$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x=x.sort{|a,b|a<=>b}}' real 0m19.140s user 0m19.055s sys 0m0.060s $ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}' real 0m19.130s user 0m19.063s sys 0m0.049s ほとんど変わんないね。
% time ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }' ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }' 4.12s user 0.01s system 98% cpu 4.171 total % time ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }' ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }' 2.70s user 0.01s system 99% cpu 2.715 total このくらいにすると変わってくるか。
>>204 user system total real
Sort 1.201000 0.010000 1.211000 ( 1.312000)
user system total real
Sort! 1.051000 0.020000 1.071000 ( 1.221000)
user system total real
Sort by 0.221000 0.000000 0.221000 ( 0.311000)
少なくともsort_byは使うの素人言われるほど常に遅いわけではないな
sort_by の利点が生きるのはブロック評価が処理が重い時だろ常識的に考えて……
209 :
192 :2007/03/31(土) 14:04:53
>>199 レスありがとう。普通はそうだよね。
でも俺は、returnは戻り値を明確にする意味で使っているので、ちょっと困った。
俺の癖として、最初は結構適当に書いて、ある程度動き出したらリファクタリング
するんだけど、returnがかけないと、修正したときにうっかり戻り値部分のシーケンス
をかえちゃって、気がつかないうちに戻り値が変わってバグっちゃうってことが頻繁に
あるんだよね。この手のバグは後から見つけるのが大変で。
注意して修正すればいいだけの話かもしれないが……
リファクタリングはテストとセット。
HTML外部ファイルにすると実行時に読み込む分遅くならないか? .rbファイルの下のほうにHTMLだけ集めて沈めておけばおk。
>>211 自分も前作ったCGIでは、必要なHTML部分を
パーツごとに変数に保存して置いて
必要な時に、使用出来る様にしてましたけど。
ズラズラHTMLが並ばずにソースの見通しもよくなるし。
HTMLの一部分を後で置き換えしたい場合なんかは
その部分に特殊な文字を設定したりしてましたけど。
<a href="_URL_">_STR_</a> とか。
ディスクにアクセスしてHTMLデータを読み込む でっかいHTMLデータをsubでスキャンして置換 でっかいHTMLデータをsubでスキャンして置換 ディスクにアクセスしてHTMLデータを読み込む ディスクにアクセスしてHTMLデータを読み込む でっかいHTMLデータをsubでスキャンして置換 でっかいHTMLデータをsubでスキャンして置換 ディスクにアクセスしてHTMLデータを読み込む でっかいHTMLデータをsubでスキャンして置換 ということを連続してやらせてるのが非常に心苦しいのでソースに直に書く Rubyソースに一緒に書いておけばディスクアクセスは1回で済むし
hash.has_key(hoge')? で1時間以上詰まった
hash.has_key('hoge')? だった 要は ? の位置
>>213 そんな事しないしw
初心者は質問するだけにしようなw
217 :
デフォルトの名無しさん :2007/03/31(土) 17:12:44
というか、みんなCGI書くときHTMLはどう管理してんの? 特別なフレームワークとか利用せずに、よい管理方法はなにかな?
eruby使ってる。
俺はRubyでは小規模なCGIばかり作ってるので 今の所はHTMLをソースに埋め込むスタイルでいいや。
221 :
デフォルトの名無しさん :2007/03/31(土) 19:51:26
erubyとERBがあってerbscanとかいうのもあってどれを使うべきかさっぱりわからない
>>217 ごく簡単なのをでっち上げるときはerbを使う。
あとコードと同じファイルの__END__以降にHTMLを書いて、
そいつを読み込んでる。ファイル一個で済むから楽でいい。
なるほど、色々あるねえ。
>>222 eRubyというのがHTMLおよびテキストファイルにRubyスクリプトを埋め込む
テンプレート言語の仕様。
erubyというのが最初の実装だったかな。
あとでpure RubyのERBが出てきた。
erbscanはERBのスキャナ部を高速化するだけで単体では動作しない。
eRuby実装としては他にもerubisというのがあった。
とりあえず標準添付ライブラリのERB使っておけばいいと思う。
>>209 ブロックってbreakで値を返せるんじゃなかったっけ?
yieldした所に値を返す場合はnextで。
>>201-207 そもそもの発端である
>>135 では
> a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
> sa = a.sort{|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i }
と書いてあるから、これにそってベンチすべきじゃね?
require 'benchmark'
data = (1..10000).collect { "f#{rand(10000)}f" }
Benchmark.bm(10) do |bench|
bench.report("sort_by") { data.sort_by {|a| a[/¥d+/].to_i } }
bench.report("sort") { data.sort {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
bench.report("sort!") { data.sort! {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
end
結果:
user system total real
sort_by 0.090000 0.000000 0.090000 ( 0.118594)
sort 1.030000 0.010000 1.040000 ( 1.154424)
sort! 1.030000 0.020000 1.050000 ( 1.348342)
もう明らかにsort_byが速い。sortとsort!の差は誤差。しかもsort!のほうが悪い数値。
>>208 今回がまさにそのケースだな
>>200 これはひどい
sort!はsortのあとに呼び出してるんだから、毎回初期化する必要なんかないと思うけど?
>>220 ああいう「文書作れるよシステム」ってのは
何か物凄いカッコイイことして生成してるんだと思ってた俺
ただの全文置換と知ったときはなんとなく失望した
Webサービス公開してる人は勉強のためにソースも公開してる? ソース公開しちゃうと穴突かれてレン鯖が過負荷攻撃とかされたりしそうで二の足踏んでるんだけど
>>200 すごいな 自信満々で赤っ恥かいてる
あと一日待っていれば「エイプリルフールネタでした」とごまかせたものを
今年はruby-lang.orgで何もやんないの?
>>233 >今年はruby-lang.orgで何もやんないの?
やってるよー。よく見てみな。
237 :
デフォルトの名無しさん :2007/04/02(月) 00:40:03
yaml使ってみようと思ったんですけど日本語が化けるのって どうしたら直りますか? #!/usr/bin/ruby -Ku require "yaml" $Kcode = "UTF8" obj3 = {"テスト"=>"250400", "テスト2"=>"25500"} p obj3.to_yaml(:BestWidth=>10000) の表示結果が激しく化けます。 "--- \n\"\\xE3\\x83\\x86\\xE3\\x82\\xB9\\xE3\\x83\\x882\": \"25500\"\n? !binary \"44OG44K544OI\\n\"\n: \"250400\"\n\n" な感じです。 環境はruby 1.8.5 (2006-12-04 patchlevel 2) [i386-linux]です。 分かる方いらっしゃったら解決方法お願いします。
>>238 そこ見てたんだが何だかうまいこと出来なかった。
んでもう一回今やったら出来ました。
ありがとです
240 :
デフォルトの名無しさん :2007/04/02(月) 10:59:45
Rubyで書かれた有名なソフトってどんなのがありますか?
特にありませんが何か?
tDiaryとか…(汗
ワードやエクセルみたいなのじゃないと駄目だろ みんなが知ってるやつ
「有名なソフト」というそのものが数少ないからな
で、ソレがあったとして、あるいはなかったとして
>>241 はどうするのかという話
使われなくなって廃れるのが怖いなら不滅のC使え
あったら参考にするし なかったら幻滅する
しつもんです。本のデータ扱ってます。 たとえば書名と著者と出版社をキーとするハッシュがあってそれが配列に入ってます。 [ { 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 }, { 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 }, { 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 }, { 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 }, { 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 }, { 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 }, { 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 }, ] これを、出版社でソートしたあと著者でもソートしたいです。 [ { 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 }, { 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 }, { 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 }, { 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 }, { 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 }, { 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 }, { 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 }, ] どのように書くのがマトモですか?
books.sort_by {|i| [i["出版社"], i["著者"]] } でどうよ
249 :
248 :2007/04/02(月) 12:53:48
books.sort_by {|i| i.values_at "出版社", "著者" } の方がきれいか
俺ならハッシュ使うよりも本のクラスを作って class Book def initialize(書名, 著者, 出版社) @書名 = 書名 @著者 = 著者 @出版社 = 出版社 ・ ・ end attr_reader :書名, :著者, :出版社 end んな感じにするけどな そうすりゃ list = Array.new list.push Book.new("エロ本","エロイ人","エロイ出版社") list.push Book.new("空手入門","マス大山","ピヨピヨ空手連盟") でソートや検索も楽になるし
>>248-249 うおおおおおれにはなにやってんだかさっぱりです(w
ありがとうです勉強します
>>251 独自クラスにして、
<=>メソッドをオーバーライドしる
ってことじゃね?
254 :
デフォルトの名無しさん :2007/04/02(月) 19:09:31
Thread.forkでつくったスレッドにはメインスレッドからjoinできないのですか?
255 :
京大生www ◆HEfxsk5e3k :2007/04/02(月) 20:00:49
てゆうかThreadって何をするクラスですか? どういう場面に有益なんでしょう
うんこしながら新聞よみつつカレー食ったりしたいだろ?
京大性はシングルタスクOS
259 :
京大生www ◆HEfxsk5e3k :2007/04/02(月) 22:55:17
ようするに並行処理がしたいってことだろうけど それって何かメリットあるの? デュアルコア対応?
無駄に気合が入ったぱるまからもう一年か。 なつかしいな。
>>258 む、スマン"ソート順が固定"の意味がいまいち掴めん。
<=>を「出版社のあと書名で比較する」って動作にしてしまうと柔軟じゃなくなるって意味なら禿同。
>>259 例えばhttpで複数のファイルをダウソしたいときとか
いちいち1個のURLのごとにレスポンス待ってたら遅いだろ?
スレッドで並行処理させれば複数のURLに同時にコネクション張れる
263 :
京大生www ◆HEfxsk5e3k :2007/04/02(月) 23:44:07
別にひとつひとつ処理しても結局時間は変わらないと思うんだけど? 同時にふたつの処理をしたら速度は1/2になるだろ、常識的に考えて
rubyはネイティブスレッドじゃないから高速化はしないので、 I/Oデバイス・ネットワークデバイスが相手でなければ、その通りだが。
そんなこと言っても理解できるとはとうてい思えないけどなw
>>267 httpの場合はどのくらい早くなるの?
つまり画面にあるエロ画像とかをまとめてDLしたい時だよな。
非常に簡単で性器表現を使えば楽勝だけど
早くなるの?
順々にDLしていくのと結局変わらないだろ。
>>267 レスするから付きまとってスレが穢れるんだろ
>>268 リクエストを出して結果が返ってくるまでに平均で1秒かかるサーバがあったとする。
a,bの2個のファイルをダウンロードするとする
順々にダウンロードする場合
aをダウンロード(1秒)の後bをダウンロード(1秒)
合計2秒
スレッドを使って平行ダウンロードする場合
aをダウンロード(1秒)
bをダウンロード(1秒)
平行してダウンロードしてるので1秒しかかからない
>>268 とあるホストが落ちていたり、転送速度が極端に低かったりする場合を考えてみろよ
よくわかんないけどじゃあ10000000個のファイルを同時に落としても1秒ってことだね。 すごいね、すごいね、嘘つきwwwwwwwww
>>252 <=>メソッドの比較動作は摩訶不思議だからな
どーゆー理屈で1とか-1とか返してんだか一見してわからんものもいくつか
メソッドチェインが素敵なので怠けて table = open('./table.txt','r').read.split(/\n/) ついついこんなコードを書いてしまうのですが、これってファイル閉じてないからよくないですか? それとも参照してる変数がないから速攻でGCたんが回収しにきたりするんでしょうか?
>>275 リファレンスマニュアルでは開けっ放しのGCまかせは推奨されていない。
>>275 table = File::read('./table.txt').split(/^/)
table = File::open('./table.txt') { |f| f.read }.split(/^/) # Ruby 1.6
ただのopen使う人ってまだ時々いるよね (こんなの勧めてるのどこの解説だ?) 1行で書くならFile.read(path)のほうが絶対にいいのに
レスありがとうございますー。
>>276 Fileオブジェクトを変数に格納しなくても「開きっぱなし」状態になるのかな、と思いまして…
>>277 おお、File::readメソッドいいですね!
使わせていただきます。
>>278 RubyのリファレンスマニュアルでIOオブジェクトのopenメソッドの説明では
詳細は組み込み関数の方見やがれ、って書いてあるのでなんとなくでした。
Rubyのというよりプログラミングののような気がする質問があるんですが、ここで聞いても良いんでしょうか。
そのプログラムをRubyで表記してたらいいんじゃね?
スレ違いなら罵倒なりスルーなり誘導なりするから普通に書けばいいんじゃねの
Enumearble#zip って何故 nil 返すんだろ? ブロックを評価した値を配列にしたものを返す方がよくね? ていうかそういうメソッドが既にあったりする?
>>279 の自己レス
readlinesっていうクラスメソッドがありました。
table = File.read('./table.txt').split(/\n/)
が
table = File.readlines('./table.txt')
になります
ただreadlinesだと改行除去してくれないっぽくて
File.readlines('./notexist.txt').map!{|x| x.chomp}
こんな感じにする必要がありました、びみょー・・
irb(main):001:0> [1, 2].delete 1 => 1 irb(main):002:0> [1, 2].delete_if { |e| e == 1 } => [2] なにこの統一感の無さは?
検索サイトを利用しようと思ってます。で response = http.post( '/cgi-bin/search.rb', 'query=subject&target=ruby' ) という形でpostしてますが、queryのたとえばsubject部分に & や > といったものが含まれてると query=you&me &target=ruby という2つではなく query=you &me &target=ruby という3つ送る解釈をされてしまって検索できません どうやればうまく解釈してもらえるようになりますか?
CGI.escapeでURLエンコードすればいいんじゃないかな
逆じゃないか おそらく HTML や XML 由来の検索ワードの中に実体参照とかがあって その & が邪魔してるってんだから CGI.unescapeHTML してみ
両方やらなきゃいけないような。
HTMLやXMLのファイルを外部からとってくる ↓ とりあえずCGI.unescapeHTMLする ↓ 抜き出したりとか加工したりとかする ↓ 外部にPOSTするときにはCGI.escapeする 流れ的にはこうかね
それだと抜き出したり加工したりするときに<なのか<なのか判らなかったりして困るような。
>>278 ファイルがでかくて逐次処理したほうがいいときとか
そういう基本的なプログラミングテクニックはのってないわな
File::readで読むのを躊躇うような巨大なファイルをrubyに食わせてやるなよ(w
よーしパパRubyで動画編集しちゃうぞ〜
どちらにしても限定的だしopenの挙動に任せるような事態じゃないな 読む前に検知して別途何かさせるべきかもしれん 「ファイル読むときの基本はFile.read」ということでいいのか
>>291 そこでアプリケーションハンガリアンですよ。
File.read()はあるのにFile.write()がないのがなっとくいかん でもFile.read()ではなく実はIO.read()であるのはもっとなっとくいかん
Rubyはちょこちょことこういう虫が出てくるからカワイイ
でかいファイルにアクセスする可能性があるなら open(){} 使って行かバイト単位で読み書きした方が良い罠 ちっこいファイルとか、試作ならreadで済ます
>>292 > ファイルがでかくて逐次処理したほうがいいときとか
ブロックつかえよ。
>>299 将来どんな大きさのファイルが来るかなんてわからないじゃないか!
どんなものに対しても考えうる最大限の用意をしておくのが
製作者としての最低限の礼儀だろ!
てなわけでrescueがトップレベルにずらーっと
>>297 おれはFile.readにモードを指定できないのがむかつく。
File.writeが無いのでFile.readは使わない
バイナリモードにできないからFile.readは使わないというより使えない
305 :
デフォルトの名無しさん :2007/04/04(水) 15:22:27
307 :
305 :2007/04/04(水) 16:11:50
>>306 素早い回答ありがとうございます。助かりました。
Structで作った構造体クラスのメンバをすべてクリアしたい場合にはどうすればよいのでしょうか? hoge.map!{|x| x = nil} だと参照元が元のオブジェクトは無関係のようで、変化なしでした。 再度Newするとパフォーマンス的に問題がありそうなので何か良い方法があれば教えて下さい。 Arrayクラスみたいにmap!があればいいのになぁ…。
ぐふっ × hoge.map!{|x| x = nil} ○ hoge.map{|x| x = nil} です。
>>306 さりげなくurlの変え方が細けえ!
404具合とか・・・
www.ruby-lang.org ってしょっちゅう 503 にならない? リロードすると大抵見れるようになるから別に良いっちゃあ良いんだけど。
文字列は全部ダブルクォートでくくって書いてるんですが シングルクォートで書いた方が良い状況はありますか? " と ' が混在するとソース全体の見ばえが雑になる気がして嫌なんですけど 何かシングルクォートで明示的にしておくべきケースがあるなら…と気になって質問しました
>>313 ダブルクォーテーションの恩恵を受けなくてもいいとき
ダブルクォーテーションだと困るとき
微々たる違いかもしれないけど、変数展開の処理がない分 シングルクォートの方が処理としては軽いんじゃ? だからダブルクォートは必要な場面でのみ使って それ以外はシングルクォートがいい ってばあっちゃが言ってた
もちろんハッシュのキーはシンボルだよな!
オブジェクト生成が重いのでクラスやモジュールは極力使わずトップレベルにメソッドを定義 外部モジュールのメソッドは使うぶんだけをトップレベルにコピペする 変数は基本的に使わず内容は手で直書き・メソッドチェーン活用 ファイル読み込みと字句解析に余分な時間がかかるのでコメントやインデント空白は一切なし
(;^ω^;)Cで書けよw
>>317 >外部モジュールのメソッドは使うぶんだけをトップレベルにコピペする
この辺りで狂喜のようなものを感じたww
大喜びですか。
>>315 微々たる違いかもしれないけど、シフトキーを押す処理がない分
シングルクォートの方が処理としては軽いんじゃ?
って英語キーボード使いのじいちゃんは言ってた
人間がコード読むときにダブルクォートだと変数展開があるかも、 って思うかもしれないからその分負担が増えるかもね 微々たる違いかもしれないけど
>>317 徹底してないな。必ず破壊メソッドを使え。
普段から気をつけると覿面なのはsortとか正規表現オブジェクトとか正規表現のマッチングとかかな?
すみません class A class B < A があったとします classAでもBでもメソッドhoge1,hoge2があったとします classBのメソッドhoge1でclassAのメソッドhoge2を呼ぶにはどうすればいいのでしょ? 普通にhoge2を呼ぶと、classBで定義したhoge2がよばれますよね? superだけかくと、classAのhoge1が呼ばれるし なんか、方法あるのかにゃ?
326 :
デフォルトの名無しさん :2007/04/05(木) 08:37:38
>>325 aliasを使えばいいかと
class B < A
alias hoge2_s hoge2
def hoge1
hoge2_s
end
def hoge2
end
end
327 :
デフォルトの名無しさん :2007/04/05(木) 08:41:56
多分継承してること自体がおかしい。
方法1 あとからclass Aのhoge2に別名を付ける。 方法2 UnboundMethodオブジェクトを取り出して呼ぶ。 後者は hoge2 = A.instance_method(:hoge2) hoge2.bind(b).call
# ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6] class C attr_reader :n def a=(x) @n = x + 1 end alias b a= end c = C.new p c.a = 3 # 3 p c.n # 4 p c.b(3) # 4 p c.n # 4 C#a= と C#b は同じメソッドなのに、何故返値が違うのでしょうか?
>>329 知っててやってるんだと思うが、代入式に見えるメソッド呼び出しの式の値は右辺の値を返す。
>>330 多分そうだろうとは思ったのですが、念のため訊いてみた次第です。
ありがとうございました。
しかしなんでこんな仕様なんでしょうか?
妙なバグを防ぐ為なのだろうけど、あまり嬉しくないような……
>>331 要するに、=つきメソッドはアクセサとして定義しなさい、ということだろう。
揚げ足取りが多いな。それほど他の言語の廚が脅威に感じてくれてる表れか。書籍もたくさんでて売り場面積も広がったしなあ。 数ギガのファイルをfilereadで処理させたら凄くメモり喰うのは、用途が間違ってるのか(w
揚げ足取りが見つからない俺
数ギガのファイルをfilereadで処理させたら凄くメモり喰うのは、用途が間違ってる以前に、 根本的に勉強が足りな過ぎだと思う。
336 :
デフォルトの名無しさん :2007/04/05(木) 13:23:03
>325 B#hoge2でsuper呼ぶか、そもそもBでhoge2をオーバライドしなけりゃいいんでね?
>>327 のレスが普通にスルーされてるみたいだけど、
A も B もいじって構わないのであれば、設計を見直した方が良いように思う。
継承自体はおかしくないかもしれないけど、リファクタリングはすべきかと。
>>333 全体がメモリ上に欲しいなら仕方ないのかも知れないが、
たいていは数MBずつ小分けにして読み込むかインデックスを
作って部分的にアクセスするようにすれば解決する。
325の設計が悪いと思う前に、 self(というかメソッドディスパッチ)に細工のしにくいCommon Lispとかならともかく、 Rubyでこのsuperの仕様はないだろうに…とMatzのセンスのほうを疑うのは俺だけか?
もうちょっと詳しく
341 :
デフォルトの名無しさん :2007/04/05(木) 19:21:28
プログラム作ってみました見てください! print(1) sleep(2) print(2) sleep(2) print(3) sleep(2) print('だあああああああああああああああああああ') どうですかね??
342 :
デフォルトの名無しさん :2007/04/05(木) 19:23:39
30分前にはじめました これからがんばります
c++暦が長いruby初心者からすると B::hoge2がA::hoge2を呼び出して、その他にB専用の追加処理をするのは、ごく自然な行為に見える。 と思ったら、B::hoge1がA::hoge2を呼ぶのかよ…
>>325 A#hoge2とB#hoge1に共通の処理を、モジュールMにメソッドとして実装する。
MをAとB両者にincludeして、A#hoge2とB#hoge1はそれを利用して実装する。
>>343 >B::hoge2
それだとクラスメソッド(C++でいうstaticメソッド)を意味する。
しかもB.hoge2っていう表記のほうが好まれる。::はクラス内の定数を参照したり
するときに使うが吉だと思う。
ふつーのメソッドは、実際の呼び出し方と違うけどB#hoge2って書くのが慣習。
>>344 自己レス。
>C++でいうstaticメソッド
やべぇうろ覚え、Javaと混ざってる鴨
346 :
325 :2007/04/05(木) 21:54:01
皆様レスありがとうございます。 instance_methodを使う方法で旨いことできました。 ちなみに、私の質問は純粋に興味から生まれた物であり、実際にその様なclassを実装しているわけではありません 設計に関する議論をしてくださった方にはご迷惑をおかけしました しかし、おかげさまで、UnboundMethodなどについても理解が深まりました ruby軽く勉強中の身なのですが、やはり深く勉強するには動かし方を表面的に学ぶだけではなく、マニュアルなどを読み込むことが必要だとあらためて感じました これからも、お世話になるかもしれませんが、よろぴくおねがいしますにゃん
最後の最後の一言が気にくわない。
>>347 想像力を駆使しろ。
,-、 ,.-、
./:::::\ /::::::ヽ
/::::::::::::;ゝ--──-- 、._/::::::::::::::|
/,.-‐''"´ \:::::::::::|
/ / \ ヽ、::::|
/ ● ● ヽ|
l , , , l
.| (_人__丿 """ |
l ヽノ l
` 、 /⌒⌒i /⌒ヽ /
`/ | | \ /
これからも、お世話になるかもしれませんが、よろぴくおねがいしますにゃん
>349 レポジトリを見てみたが、登場当初から nil を返すコードな気がする。 ドキュメントの間違いだろう。
>>349 Rubyで「偽」って言ったらnilとfalseのことなんだから、
間違いではないんじゃね?
hoge.gi? # -> joe
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] で require 'tk' TkButton.new(nil, 'text'=>'exit', 'command'=>proc{exit}).pack Tk.mainloop を実行すると --------------------------- ruby.exe - コンポーネントが見つかりません --------------------------- tk84.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。 --------------------------- OK --------------------------- c:/bin/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so: 126: 指定されたモジュールが見 つかりません。 - c:/bin/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError) from c:/bin/ruby/lib/ruby/1.8/tk.rb:7 from c:/home/test/test.rb:1:in `require' from c:/home/test/test.rb:1 というエラーが出ます。 TK使う場合何か特別なセットアップが必要ですか?
環境変数 TCL_LIBRARY と TK_LIBRARY かな?
Tcl/Tkが別途インストールされて無いだけじゃね?
メールでの日本語Subjectをつくるのに一番無難な方法って何ですか?
.tojis
>>354 俺も昔同じ状況になった。
WinXP なんだが、ActiveTcl インスコして
tcl\bin にパス通したら出なくなった。
ShiftJISでも結構平気 日本語投げてもASCIIだけを投げても一発でうまく変換するメソッドは作られてないんじゃなかろうか
tmail…
NKFである程度はできるだろ… irb> subject='RFC2047ではヘッダフィールドは1行76文字以内(改行含む)でなければならない…ってNKF自身が76文字で改行してるじゃん…' irb> puts NKF.nkf('-EM',subject) =?ISO-2022-JP?B?UkZDMjA0NxskQiRHJE8lWCVDJUAlVSUjITwlayVJJE8bKEIxGyRCOVQbKEI3Ng==?= =?ISO-2022-JP?B?GyRCSjg7ejBKRmIhSjJ+OVQ0XiRgIUskRyRKJDEkbCRQJEokaSRKGyhC?= =?ISO-2022-JP?B?GyRCJCQhRCRDJEYbKEJOS0YbJEI8Kz9IJCwbKEI3NhskQko4O3obKEI=?= =?ISO-2022-JP?B?GyRCJEcyfjlUJDckRiRrJDgkYyRzIUQbKEI=?=
こいつを実行するとIllegal instructionというエラーが出て ruby(1.8.6)が落ちてしまうんですが、どうしたもんでしょう。 def until_catch(*symbols) raise LocalJumpError, 'no block given' unless block_given? symbols = [symbols] if symbols.kind_of? Symbol pr = proc { loop{ yield } } symbols.reverse_each { |sym| pr = proc { catch(sym) { pr.call } } } pr.call end until_catch(:a,:b,:c,:d) { p(r = rand); throw :b if r < 0.3 }
367 :
366 :2007/04/07(土) 19:15:55
すいません、スタックフレーム作ったら解決しました。 なんか悪い事をしたときには例外が上がるもんだと思っていたので、 突然インタプリタが落ちたのに動揺してしまって…… どうやら再帰の無限ループになってたみたいですね。 irb(main):001:0> def f(x) f x; end; f 0 Illegal instruction $ 以下、修正版です。 def until_catch(*symbols) raise LocalJumpError, 'no block given' unless block_given? symbols = [symbols] if symbols.kind_of? Symbol procs = Array.new(symbols.size + 1) procs << proc { loop{ yield } } symbols.reverse_each { |sym| procs << proc { catch(sym) { procs.pop.call } } } procs.pop.call end
368 :
デフォルトの名無しさん :2007/04/08(日) 17:24:19
Rubyでプロセスを新規生成しないWebアプリケーション環境はありますか? そのような環境ではENVなどの定数の環境変数はどのような扱いになるのでしょうか? (同一プロセスでクライアント毎に異なる定数を使うことが可能?)
369 :
デフォルトの名無しさん :2007/04/09(月) 11:21:23
結局Thread.forkはなんなのかよくわからないな。 Thread.startとの差がソースを読んでもよくわからないが、 実行すると差がある。なんでだ?
>>368 サーバ関連の知識を基礎から学習した方がいいと思われ
>>368 CGIとの対比でいっているなら mod_ruby または FastCGI
ENVについては、ユーザからのリクエストごとに再設定されるだけ。
Javaのようにスレッドで処理されるわけじゃない。
>>369 > 実行すると差がある。なんでだ?
どんな差?
前者はギュイーンって感じだけど 後者はビンビンって感じ
ファイルの最後の行だけを読み取りたいと思ってます。 ファイルサイズが大きくなると単純にreadlineの繰り返しじゃ重そうなので、 1.ファイルのEOF一歩手前までシーク 2.一文字読み取り 3.\r or \nならreadline 4.そうじゃないなら一文字分手前にシーク(2から繰り返し) って処理にしようと思いました。 File.open('./result.txt'){|f| f.seek(-2, IO::SEEK_END) until (c = f.getc).to_s =~ /\r|\n/ puts f.pos f.seek(-2, IO::SEEK_CUR) end } posメソッドでシーク位置を確認しているのですが、 f.seek(-2, IO::SEEK_END) だとシーク位置が変わらず、 f.seek(-3, IO::SEEK_END) だとシーク位置が2ずつ下がっていくと言う摩訶不思議な現象が起こっています。 原因が分かる方いらっしゃいましたら教えてください。 あと、「せっかくだから俺ならこうするぜ」みたいなのもあったらぜひぜひおねがいします。
漏れなら真っ先に File::open がバイナリモードかどうかを疑う。
376 :
デフォルトの名無しさん :2007/04/09(月) 20:38:46
>>370 ( ゚д゚)、
>>371 新たにプロセスを生成せずにRubyスクリプトを実行している場合定数やグローバル変数はどうなるのでしょうか?
CGIでグローバル変数を使用していた場合mod_rubyに移行することはできないのでしょうか?
だから、わかってるならわかってるように言葉や表現を交えて質問しろ 何を意図してるのかはわからんでもない気はするんだが、そんな推測に頭使いたくないから賢いとこ見せてくれ
馬鹿以外には理解できる記述を、既にきちんと成功させております。 それでもなお理解できない馬鹿の「馬鹿な俺にも理解できるように書け」という馬鹿要望は 当然ながら無視させていただきます。
>>376 あんたの推測通り、定数やグローバル変数や、あとクラス変数とかはそのまま引き継がれる。
これらに依存したCGIスクリプトはmod_rubyではうまく動かない可能性が高い。
>>377-378 ここは初心者スレ。初心者に我慢強く相手することができるやつだけがくればいい。
おまえらのようなやつはここにくるな。本スレだけみとけ。
>>376 定数は変更されないはずだから、これは問題になることはないだろうね。
グローバル変数やクラス変数も、使い方によってはセーフかもしれないけど、まあふつうはアウトだな。
あと、ファイル関係とセッション関係も気をつけた方がいい。
ファイルを開いたまま閉じてなかったら、CGIでは動いてもmod_rubyではちゃんと動かない。
セッションを閉じる前に例外が発生すると、セッションファイルがロックされたまま閉じられずに残るから、次にアクセスされたときにセッションファイルが開けずにはまった。
>>378-379 春休みだなあ。
>>1 をよく読めな。
一発で読めない程度の複雑さの正規表現を変数に入れとくことにしました たとえばHTMLからAmazonのURLをscanして取り出すときに使う正規表現です ・ re_amazon_url ・ amazon_url_re ・ re_scan_amazon どんな変数名がわかりやすいっすかね
>382 俺なら一番目。 好みで言えばre_ではなくregex_だが、まあ分かればいいわな。
RE_Amazon_URL
385 :
デフォルトの名無しさん :2007/04/10(火) 15:12:21
scanは違うよな。 正規表現は「対象を一言で言い表したもの」に過ぎないわけで、 scanはその正規表現を使う側の視点なんだから。
>>386 「ruby rss」でぐぐれ。最初のページにチュートリアルがある。
以下サンプルコード
#$KCODE = 'utf8'
require 'open-uri'
require 'rss'
url = '
http://pickup.yahoo.co.jp/rss/index.xml '
s = open(url) { |f| f.read() }
rss = RSS::Parser.parse(s, false)
item = rss.channel.items[0]
puts "title: #{item.title}"
puts "link: #{item.link}"
puts "description: #{item.description}"
>>374 こっちは-2で動いたよ。環境:MacOS X 10.4, Ruby 1.8.6
s = ''
File.open(filename) do |f|
f.seek(-2, IO::SEEK_END)
until (c = f.getc) == ?¥n || c == ?¥r
#puts f.pos
s << c.chr
f.seek(-2, IO::SEEK_CUR)
end
end
puts s.reverse
389 :
386 :2007/04/10(火) 16:52:41
>>387 ズバリ教えてくれてありがとう。
もし宝くじを買う習慣がないのなら、次回に二枚買ってみてね。
>>382 re_ ってつけるのも本質的にはどうよって感じはするけどな
マッチしたあと何が残るのかがわかるような名前にする…と思う
scanナントカ とか ナントカsplit とかは悩みたくない時に時々使う
「正規表現のとこがエディタで表示が横に長くなるから」というだけの理由で
「html.scan(re)」とかにして意味もなく変数 re に囲い出すこともあるがよい子は真似してはイカン
>>390 > 「正規表現のとこがエディタで表示が横に長くなるから」というだけの理由で
それ重要。よい子は x オプションを適切に使いこなします。
392 :
デフォルトの名無しさん :2007/04/10(火) 21:14:07
すんません、質問です。 どっちともStringオブジェクトのはずなんですけど URLに引数を渡した方は正規表現が使えません… CGIがらみなんでアレなんですけど、何故なんでしょうか? [コード] ------------------ require 'cgi' Cgi = CGI.new str = Cgi['str'] if str == '' str = 'test' end Cgi.out{ #str.class.to_s str[/es/] } script.rb → es script.rb?str=test → 何も表示されない… "str.class.to_s"でチェックすると どちらも間違いなく"String"となっている。
cgi[...] って同名パラメータの配列じゃね?
394 :
392 :2007/04/10(火) 21:35:53
>>393 str = Cgi['str'][0]
忘れてました…orz
ありがとうございました。
395 :
デフォルトの名無しさん :2007/04/10(火) 21:40:20
でも、これで「Array」にならないのは何故?? Cgi['str'].class.to_s
cgi.rbの[]の定義追いかけてたらわけわからんくなった。
cgi[key]とやると、 まず該当名のパラメータ(配列) @params[key] を見付ける。 基本的にこの配列の先頭要素のStringが返るのだが、その前にこの Stringに対してValueというモジュールのメソッドを特異メソッドして 定義し、また、@params[key] 配列をこの Stringに付随させてから返している。 Valueでは [] を定義しているので、[/REGEX/]という記法は本来の Stringとは動作が変わってしまうようだ。 この[]によって、配列の残り部分にアクセスすることが可能になって いる。
というか、インスタンスを定数に入れるのやめようぜ…
わかったような、わからないような… とにかく面倒臭い事になってるという事はわかった。
cgi[]で返ってくるのは確かに String だが、正規表現を引数に取れる String#[]ではない別の[]が定義されてているので、元質問のコードは 思ったように動かなかった、ということだな。
ふむふむ… しかし紛らわしいなぁ… それならいっそ別のクラス名にしてくれてた方がいいのに…
これからパラメータにアクセスする時は 必ず、cgi[key][0] ってする事だね。
cgi.rb読む人が増えているこの時期、またセキュリティホール 見つかるんじゃないか? # cgi.rbよりwebrick/cgi.rbのほうが分かりやすくていいなぁ
cgi.rb はなにか鶴の一声で絶滅させないといかんと思う 今まで本当によく頑張ったが、いかんせん安普請だ 表現は酷だが、飛び立つには足かせになりかねん
おれもそう思う。cgi.rbはとってもお世話になったが、 あちこちに破綻がありすぎる。 がこれを前提にしているライブラリがたくさんあることも事実なんだよね。 葬り去るにはあまりにも影響がでかい。
クロージャのありがたみって実際なんなんでしょ? java界隈にいても、ruby勉強しててもクロージャのありがたみを布教してくれる方が多いのですが、いまいちよくわかりません それと、rubyのクロージャって他とは何か違うのですか?
>>406 Javaのクロージャってなーに?
Java7の話?
クロージャはクロージャでしょ。
C#やDelphiでGUIアプリ組んでイベントハンドラ書きまくってればその恩恵を受けることが出来るかもな。
コンソールでメニューを作るライブラリってないでしょうか? w3mのオプション画面のcharsetの設定でやってるような メニューを作りたいんですが、かなり大変そうなんで…
ま た 端 末 制 御 か 保証はしないが curses でぐぐれ
CGI.paramsとCGI.escapeHTMLとCGI.encodeしか使ってない ソースからそこだけコピペしたら全体の起動時間短縮できるかな
Time型って2038年以降扱えないはずだけど、 サーバーが64bit版なら機能したりする? 2038年以降も入ったかいう報告があるんだけど。 OS依存なのかな、ここの仕様は。
>>413 まずはリファレンスマニュアル見れと。
> Time オブジェクトが格納可能な時刻の範囲は環境によって異なります。
本当にごめんなさい。なんで読み落としたんだろう・・・
URL踏んだ人のIPをひたすら晒していくCGIってどう書けばいいの?
#!/usr/local/bin/ruby puts "Content-Type: text/plain\n\n#{ENV['REMOTE_ADDR']}"
USER_AGENTとかも表示すればワンクリサイトを作るのも簡単だねっ。
ワンクリといえば、昔(90年代) ダイヤルアップ接続が普通だった時代 知らぬ間にQ2に接続されて、法外な料金請求された苦い過去を思い出す。 知識もないのにエロサイト見てた自分が悪いんだけどw
#!/usr/local/bin/ruby require 'cgi' CGI.new.out{'HTTP'}
>>408 そうですSE7の話です
自分はよくわかっていませんが
どっかにクロージャのありがたみについて詳しく解説しているページないかにゃ?
rubyのコードが付いてればなおありがたい
.rbっていう拡張子がタイプしにくくて嫌なんだけど、みんなは気にならないの?
5分ほど息を止めてみるともっと楽になるよ
どうもRubyコミュニティはいかんな。 ちょっとでもスタイルに疑問を呈されると、寒くてネチャネチャしたリプライが来る。
まだ拡張子つけてるのかよ。 shebangとemacs modeで児童判別させるのがプロ
>>426 Rubyスクリプトかどうか確かめるのにわざわざファイルの本文にアクセスさせる気?
アホくさ
ファイル先頭に128バイトくらい確保して判別するほうがマシだ
>>422 この前D言語スレでそんな妄想をみんなでしてたぜ
>>423 逆にどんな拡張子が良いんだ?
.rbyとかだったら俺泣いちゃうぞ
.omaz
>>429 あのさ、".rb"に難があるかどうかという以前の問題として、
タイプの話をしてるときに元の字をそのまま残した例を挙げてもなんにもならないだろう。
左人差し指を上下に動かしてタイプするのが面倒だという話なので .ff とか .jj とか そういうのが望まれてるんだと思われる
>>423 気にしようが気にしまいが.rbから他の拡張子に変わることはないだろう?
画期的に打ちやすい拡張子をみつけて啓蒙していくしか道はないだろうな。
とりあえずタイプしやすい拡張子として.fってのはどうかな?
.xrbは打ちづらくて挫折したw
打ちやすさだけならruのほうが上だけど、俺の感覚だとbが無いと締まらない。
まぁplのほうが打ちにくいし、rbで十分だな、俺は。
>>432 あんたbを人差し指でタイプするの?
>>434 Querty配列では 4 R F V と 5 T G B の列は左手の人差し指でタイプするものだが。
ど う で も い い
.r
どうでもいいことに口挟むためにわざわざ スペース右スペース右スペース右スペース右スペース ってお前・・・
rbよりもrubyの方がリズミカルに打てて気持ちいいと思う
>>439 確かに。
ruby って打つときはタ、タンって感じだよな。
perlはタタタンでpython はタ、タ、タタン。
つーかpython打ちにくすぎ。
>>440 その三つの中では ruby が一番打ちやすいな。
左右交互なのも打ちやすさに影響してるかな
443 :
デフォルトの名無しさん :2007/04/13(金) 00:53:45
質問なんですが、rubyでスレッド5個くらい作って、net/httpやopen-uriで複数の大きなファイルをダウンロードすると、CPU使用率が100%回りっぱなしになってしまいます。 巷のダウンロードソフトは複数スレッドでも極めて低いCPU使用率でダウンロードし続けることができることを考えると、できればrubyでもそうあってほしいと思います。 どうすればもっと静かにダウンロードさせることができるでしょうか? 環境はwinxpでruby1.8.5です。
なんでCPU使用率が上がるかを考えればいいんと違うかな
Windowsのスレッドだからかね net/httpやらopen-uriやらはデータをメモリに全部食うような気がする
ユーザースレッドだからね
>>443 WindowsのスレッドとRubyのスレッドは根本的に異なっているので、解決は難しいかも。
簡単なサンプルコードをみせてくれないか?
スレッドじゃなくて別プロセスにしてDRbでプロセス間通信させたほうが 軽いんじゃないか?
.by …もっとPythonぽいのないかな?
.(ry
隔離スレでやれ
つーか、.rb で十分打ちやすい。
453 :
デフォルトの名無しさん :2007/04/13(金) 10:55:57
PerlのXML::Simpleのドキュメントは man XML::Simple で見れます。 rexml のドキュメントを同じようにみるにはどうすればよいでしょうか? ちなみに、 locate man | grep -i rexml で何もひっかかりませんでした。
針がいっぱいついてそうなレスだな
456 :
453 :2007/04/13(金) 12:38:33
>>455 ありがとうございます。
インストールしました。便利になりました。
>スクリプト言語のライブラリやらなにやらがmanで表示されること自体が特殊事象
そうですねW
>>440 ruby あたたあたあた
perl あたたたた
python あたあたあたたたた
俺のながでばperlがぶごべろばっ
Rubyを貶した文章は色々あったけど、中でも嫌味度ナンバーワンじゃね?
>>457
そうですね
誹謗のためにあさって向いてないぶん悪質だな! っていうか嫌味っていうか普通に使いにくいわかりにくいとこに文句つけてるだけじゃん… Rubyは完璧だと言ってる人ってそうそう居ないと思うし非難のための捏造敵だと思うぞ
回避策とか代替案があるとか、改善できるところならいいが 「もう直しようがないだろう」みたいなとこをつつくのはちょっとな。 # そういう意味ではM17Nとかcgi.rbとかRuby2.0仕様とか # そういう点を付くのは叩く側としてはコストが低くて良いねw
日本人は足の引っ張りあい大好きですから!!!!!!!!!!!!!!!!!w
ここもDelスレみたいになってきたな。 住民もかぶってそうだしある意味当然か。
Delスレなんて言われてもわかんぽっぽ
RubyにはPerlのリファレンスのようなものありますか?
Perlのリファレンスってなに? 電子的なマニュアル? 網羅的で薄い書籍? 体系化されたマニュアルシステム?
あ、ごめんなさい。 たとえばPerlで、ハッシュに対するリファレンスは %EtoJ = { 'dog' => '犬' } に対して $hush_ref=\%hush で定義されるものです。 配列、スカラーに対しても同じように定義されます。 関数に渡すときにリファレンス渡しをするとCのポインタのように便利です。
>468 Rubyの変数が保持するのは参照だから ハッシュを変数に入れてるならそのまま渡せばOK ただし変数に再び代入すると参照先が書き変わってしまうので 内容を更新する場合は各要素にアクセスするかreplaceを使うこと
>>462 rubyのイテレータが打たれ弱いというのは直しようがないんですか?
471 :
469 :2007/04/13(金) 18:50:14
# 例 def func(h) h['key1'] = 'Good' h['key2'] = 'bye' h = {'key1'=>'How', 'key2'=>'much'} # ここで h の参照先が変わり元の hash にアクセスできなくなる h['key2'] = 'many' end hash = {'key1'=>'Hello', 'key2'=>'world'} func(hash) p hash # 結果 => {"key1"=>"Good", "key2"=>"bye"}
外部イテレータをほとんど標準で提供していなかったあたりが 厳しいなぁ。 内部イテレータから外部イテレータの書き換えは、大変だしねぇ。 Enumerable#zipって使えたことある? メソッド名の衝突が起こりはじめたらヤバイ。 Classboxだかselector namespaceって実装されるのいつよ?
>>469 Hash#update(other)も使えるね。
キーの削除ができないけど更新と追加はできる。
474 :
468 :2007/04/13(金) 20:38:28
>>469 なるほど。わかりました。
関数の引数にした場合も参照が渡されるんですね。
>>473 参考になりました。ありがとうございます。
>>471 …これ地味にヤバくね?
適当にハッシュでデータを保持してて
適当に長いメソッド内の途中でfuncに別途切り出しして
適当にハッシュだから切り出したメソッド内ではhやhashでいいやとか
そういうことってときどきあったりしない?
>>475 変数hの参照先が変わるのはfuncメソッドのスコープの中だけ。
呼び出し元の変数hashの参照先はかわらん。
replaceしたなら値が変わることはあるけどね。
>>475 def func(h)
h['key1'] = 'Good' # h.id=111
h['key2'] = 'bye' # h.id=111
h = {'key1'=>'How', 'key2'=>'much'} # hash.id=222
h['key2'] = 'many' # h.id=222
end
hash = {'key1'=>'Hello', 'key2'=>'world'} # hash.id=111
func(hash)
p hash # hash.id=111
#=> 現在の「idが111」の内容、つまり key1 が 'Good' で key2 が 'bye' が表示される
途中に 「h = {'key1'=>'How', 'key2'=>'much'}」 があるから奇異に写るかもしれないけど、
いわゆる昔から言われてる参照に要注意という問題に過ぎない
h=Hash.new # h.id=111
h={['one']=>'1'} # h.id=222
478 :
443 :2007/04/14(土) 08:31:56
レスくれた皆さん、ありがとうございます。
返事遅れて申し訳ないです。
>>444 できれば、なぜCPU使用率が上がるのか知りたいです。
>>445 ,446,447
Winじゃ難しいっぽいですか・・・。
>>448 DRbですか。自分にはまだ難しそうですが、時間ができたら試してみます。
>>478 だから自分で書いた簡単なサンプルコードをみせてみろといってるでしょ
話はそれからだ
480 :
443 :2007/04/14(土) 08:52:03
>>447 雰囲気だけですが、こんな感じです。
それぞれのスレッドは1つのファイルをダウンロードするのに専念させてます。
require 'net/http'; Net::HTTP.version_1_2
require 'uri'
require 'set'
def download url
uri = URI(url); http = Net::HTTP.new(uri.host, uri.port)
http.request_get(uri.path + '?' + uri.query) {|res|
open(出力ファイル名, 'wb') {|out|
res.read_body {|chunk| out.write chunk}
}
}
end
thr_set = Set[] # ダウンロード中スレッドを入れるためのSet
N = 5 # スレッドの最大個数
[ダウンロードするURL].each {|url|
sleep(1) until thr_set.size < N # スレッドの個数が多すぎなくなるまで寝る
thr_set << Thread.start {
download url # ダウンロード
thr_set.delete Thread.current # 終わったらSetから削除
}
}
thr_set.each {|thr| thr.join} # メインスレッドが終了しないように、稼働中のスレッドを待つ
>>477 前から気にはなっていたが面倒で放置してたバグがいっこ取れた
その問題は聞いてはいたんだが実地でピンと来るまでには至ってなかったみたい
class A def initialize(h); @h=h; end def run B.new(@h) C.new(@h) end end class B def initialize(h); @h=h; add; end def add @h['B']='Bだよ' end end class C def initialize(h); @h=h; add; end def add @h['C']='Cだよ' end end h={'A'=>'Aだよ'} A.new(h).run p h #=> {"A"=>"Aだよ", "B"=>"Bだよ", "C"=>"Cだよ"} がーん
どこががーん?
クラス B や クラス C で @h を扱う際に、「元の」 h には影響しないイメージがあるんだろ 新規インスタンス内で @h に「なった」時点で前とは別物、みたいな どこのクラスで"代入"しても元の値が変わるなんて昔の言語のグローバル変数みたいな動作だし 気を遣いたくない、イメージ通りの動作をさせたいのなら initialize のときに必ず dup しておくようにするしかないな
>>484 はいはい、そうです
h={'A'=>'Aだよ'}
h=A.new(h).run
p h
みたいに再代入になってる(A.runの最後でreturn @hとか書いてある)ならわかるんですが、
別オブジェクトの別メソッド実行しただけなのにhが変わるってなにそれ、みたいな
みんなこの動作に依存してクラスとかメソッドとか書いてるのかな
慣れて判断するのにしばらくかかりそう
変数とオブジェクトの区別が付くようにならないとね。
>>485 別にメソッドの呼び出し前後で、hは同じオブジェクトを指してるんだから問題ないじゃん。
ただオブジェクトの内容が変わっただけの話で。
>>487 関係なくもないとは思うが、変数とオブジェクトの区別をつけただけでは
これは間違うような気がする
巷の値の代入と同じ記号かつ同じ文法だが
実際は代入(コピー)ではなくてただのオブジェクトの参照記号である
というような理解をしないとどうにもならないと思う
問題は = の役割かと思われ
>>485 あー危惧は理解した
hash={てきとうな内容}
不慣れなクラス::不慣れなメソッド(hash)
p hash #=> hashの中身が変わってる…
こういうことが起こると嫌だなってことか
そんなあなたに つ freeze
>>491 can't modify frozen hash
例外のおかげで、変更して欲しくないものが勝手に変更されそうになっている危険が検出されたってわけね
てゆーか、cloneして渡すんじゃ駄目なのか?
ハッシュが巨大じゃないなら別にいいんじゃね? まあ現実問題、どっかのライブラリのメソッドで、ハッシュを引数にとって中で変更するようなものはまずないし、しかもどっかのメソッドに渡したハッシュを後で使うシチュエーションもほとんどない。
> どっかのメソッドに渡したハッシュを後で使うシチュエーションもほとんどない ↓以下死屍累々
もうぼろぼろです。
>>495 はハッシュをどういう用途で使ってるのかちょっと気になる
>499 いわゆる「名前付き引数」専門、とか
まあライブラリのメソッドでは、名前付き引数とコンテナの生成くらいしかハッシュを渡す機会もないかもな
生のハッシュは 日常の気合入れたくないスクリプトや 自作でごそごそするでかいだけのスクリプトで えいやーと使うのに合ってるな
hash = {} while gets do hash[$_] = true end puts hash.size
uniq | wc -l ってこと?
しつもん。 hashにkeyがあったときに起きる例外ErrorTestが起きたときの hashの中身を知りたいです。 class ErrorTest < StandardError attr_accessor :data end begin hash={'key'=>'value'} if hash.has_key?('key') then err=ErrorTest.new('適当なエラーメッセージ') err.data=hash raise err end rescue ErrorTest => ex puts "例外発生時のデータは#{ex.data.inspect}です!" end これで問題ないでしょか。
STDIN(,STDOUT,STDERR)と$stdin(,$stdout,$stderr)の使い分けがいまいちピンとこないのです。 - STDIN が定数で $stdin が変数なのはわかる - 定数には再代入できなくて変数には再代入できるのもわかる - 標準入力先を変更したければ STDIN.reopen(...) なり $stdin = IO.open(...) すればよい マニュアル読むと「子プロセスにもリダイレクトの影響を与えたたいという要件がなければ」 どっちでもよさげなかんじなのですが… $stdin にファイルじゃないオブジェクトを代入する(これはSTDINではできないことですよね)と嬉しいことがある?
>>505 別にそれでいいとは思うけど、ErrorTest の initialize で @data を初期化する方がいいんじゃないかと思ったりもする。
raiseの第1引数は ・文字列もしくは ・exceptionメッセージに対して例外を返すオブジェクト(例外クラス)だな。 Exceptionインスタンスもexceptionメッセージを持っているが、 自身と同じインスタンスを複製して返すので二度手間になるから raise ErrorTest, "メッセ" がオススメ。
失礼。例外オブジェクトがメッセージ以外に属性を持つなら、 インスタンスを作って渡すべきだな。
x = [1, 2, 3, 4, 5] p x p x.inject(0) {|result, x| result + x} p x これを実行すると、以下が出力されました。 [1, 2, 3, 4, 5] 15 5 そこで、以下のように思ったのですが正しいでしょうか? 1. ローカル変数とブロックローカル変数は同じ名前空間を共用する 2. defでメソッドを定義するときは定義ごとに別の名前空間が用意される
ブロックで使われる前に名前が登場したローカル変数は、 ブロック内でそのまま見える。 ブロック内で初めて登場したローカル変数はブロック内のみで有効。 実はこの仕様はRubyの混乱を呼ぶ点の代表選手で、将来的には変わる可能性がある。
考え分けるの面倒だから、if の結果で変数の初期値決めるときにも if 文の前に str=String.new とかいちいち書いてる
ブロック内から外側が見えるようになってるのは、クロージャとつじつまを合わせるためだろうね。 でも、ブロックの引数だけはブロック内ローカルであってほしいと思ったことは何度かあるな。
質問 「実行中の自分のファイルパスあるいはディレクトリパス」 を知る方法はありますか? 別なディレクトリでスクリプトを実行したときも 自分と同じディレクトリにあるファイルをrequireしたいです ふつーに require 'lib.rb' と書いただけでは、 「カレントディレクトリにlib.rbはありません」というエラーになります
>>514 $0
$PROGRAM_NAME (ruby 1.8 feature)
>>512 if~else~endのどの√でも確実に何かを代入するのなら、newせんでも、
str = nil でいいぜ。
>>514 $:.unshift(File.dirname(__FILE__))
517 :
510 :2007/04/15(日) 14:36:45
>>507 class ErrorTest < StandardError
def initialize(msg='')
@message=msg
@data=Hash.new
end
attr_accessor :data, :message
end
こうですかよくわかりません!
なんか途端に書くの増えましたな
うん、なんとかします多謝
> 実はこの仕様はRubyの混乱を呼ぶ点の代表選手で、将来的には変わる可能性がある。 そして新たな混乱を呼ぶ。
>>514 オプションとかRUBYLIB環境変数でlib.rbのパス渡すんじゃだめなん?
コードアシストしてくれる開発環境ってないんでしょうか?
522 :
デフォルトの名無しさん :2007/04/15(日) 15:41:45
>>513 ちょっと確認。
ブロック内で使って変数は、ブロックローカルなのに、
ブロック内引数は、外側からも見えるの?
>522 irb(main):001:0> a = 1 => 1 irb(main):002:0> 1.times{ a = 0 } => 1 irb(main):003:0> a => 0 irb(main):004:0> 1.times{ b = 0 } => 1 irb(main):005:0> b NameError: undefined local variable or method `b' for main:Object from (irb):5 aは外の変数を参照、bはブロックローカル。 このルールはブロック引数も同じ。 こういう挙動がややこしいから、ブロックローカルのルールを変更しようという話が出ている。
>>523 がまったく自然だと思うのは俺がruby脳に侵されているせいか?
いや、仕様上はある程度は自然で直感的だと思う ブロックかどうか判別しにくい文とかがたくさんあるのが原因なのかも each do 〜 end はブロックだけど if 〜 end はブロックじゃないとか
>>480 試してみたけど、ふつうにうまく動いたよ。
CPU利用率が100%になるなんてことはなかった。
環境:MacOS X 10.4 Tiger, Ruby1.8.6, intel mac
527 :
524 :2007/04/15(日) 18:49:52
>>525 おれは、どちらかというと門外漢なんだけど、むしろ、そっちをどうにかしてほしいと思う。
>>480 もとの
>>443 をみると、Windowsの話だったねごめん。
でもRubyのスレッドはユーザーレベルスレッドだから、OSに関係なく動作するはずだな。
Macでうまくうごくなら、Windowsでも同じように動くはずなんだが。
>>518 せっかくStandardErrorをけいしょうしているんだから、それを使わないと。
class ErrorTest < StandardError
def initialize(msg='', data=nil)
super(msg)
@data = data
end
attr_accessor :data
end
err = ErrorTest.new('foobar', 123)
p err.message #=> "foobar"
>>513 >でも、ブロックの引数だけはブロック内ローカルであってほしいと思ったことは何度かあるな。
はげどー
532 :
443 :2007/04/15(日) 23:40:44
>>526 わざわざ試してくれたんですか。どうもありがとうございます。
手元のPCはノーパだしCeleronだからかもしれないですけど、自分のとこだと以下のようになりました。
スレッド1個 → 0〜20%、スレッド2個 → 10〜40%、スレッド3個 → 40〜80%、スレッド4個 → 60〜90%、スレッド5個 → 70〜100%、スレッド6個 → 100%
マシンの性能がかなり色濃く出てしまうのかもしれないです。
近頃はハイレベルなハカーはみんなMAC使ってるのでうらやましいっす。
>>511 ,517,519
もう変わってる。
c:\home>ruby -v inj.rb
ruby 1.9.0 (2007-03-05 patchlevel 0) [i386-mswin32_71]
warning: shadowing outer local variable - x
[1, 2, 3, 4, 5]
15
[1, 2, 3, 4, 5]
c:\home>ruby185 inj.rb
ruby 1.8.5 (2006-08-25) [i386-mswin32]
[1, 2, 3, 4, 5]
15
5
もう変わってるじゃなくて、「1.9ではいまのところ変えてる」んじゃないのか? それとも確定?
535 :
デフォルトの名無しさん :2007/04/16(月) 03:33:48
Rubyで簡単な直線とか点とかが描画したいのですが、何か良い方法はありますか? 例えば、そういう事をするのに便利なGUIライブラリとか。 ウィンドウが簡単に出せて、その中に、単純な図形とかを描画できればいいのですが。
>>534 ruby-dev 29861 と 29863 のやり取りみると確定のような気がするんだけど?
Rubyをある程度覚えるとどんなことが出来るようになるのでしょうか? 大学の講義でRubyのさわりだけやったのでおもしろそうなことができるのであれば このままRubyの勉強を続けてみようと思います。
>>532 それ、なんかスレッド関係なくない?
CPUの負荷が高いのは、Rubyのスレッドを使っているからじゃなくて、
単にRubyが遅いからだけのように見える。
速いマシンを借りてみて、同じように負荷が高くなるか実験してみるといいんだけど。
542 :
デフォルトの名無しさん :2007/04/16(月) 09:31:33
STDINで使えるメソッドを調べたいのですが、マニュアルないですか? リファレンスのSTDINのページ見ても、編集されてないみたいですが・・・
dictにはget(key, value)という大変便利なメソッドがあります。 dct = { 'foo':1, 'bar':2 } dct.get('baz', None) #=> None 同じものがlistにないでしょうか。 lst = [1,2,3] i = 4 lst.get(i, None) #=> None 今は def getvalue(lst, i, value): if 0 <= i < len(lst): return lst[i] else: return value という関数を定義しているのですが、標準でそういう関数があれば教えてください。
ごめんなさい、誤爆でした。
546 :
デフォルトの名無しさん :2007/04/16(月) 10:36:54
547 :
535 :2007/04/16(月) 11:30:14
>>543 p IO.methods.size
p STDIN.methods.size
は違うよ。
>>548 そりゃ別のクラスのインスタンスなんだから違っていて当然。
>>550 なんで? ていうか
>>542 は理解しているのに今更そんなことを言って何の意味があるんだ?
不親切ではあるまい。STDINが指している先のオブジェクトのクラスがわかれば
調べようがあるだろう。
>>542 が理解しているという意味はこのことだ。
それに、
> そりゃ別のクラスのインスタンスなんだから違っていて当然。
の意味がお前さんには理解できていないように見受けられるが。
>>551 >>542 は本当に理解してるか?理解してるなら良いけど、
IOクラスのメソッドが全部使えると思ってないか?
IOクラスに載ってないメソッドがあることわかってるか?
>>552 あのさ
>p IO.methods.size
で得られるメソッドの数って、クラスClassのオブジェクトIOが持つメソッドの数なんだけど。
>p STDIN.methods.size
で得られるメソッドの数はクラスIOに属するオブジェクトが持つメソッドの数なんだよ。
ここまで言わないとわからない?
>>553 それがわかっててなんでそんなに粘着するのかな?
IOとSTDINのメソッドは重なる部分が多いが完全には一致していない。
そしてIOにないメソッドがSTDINにはある。ここまでは良いよね?
>>542 はIOではなくSTDINで使えるメソッドを調べたいんだから
>>542 にとって
>>548 の書き込みは得になっても損はしないと思うんだが
なにがそんなに気に入らないんだ?
間違えたなどということはあってはならんのだよ たとえ無名での書き込みでもな
「今この瞬間だけ世界の王になった気になって楽しんでるのに 俺の現実的な不完全性を指摘するなこの野郎」 ということでしょう。
文字列中の特定の文字列(たくさん種類がある)を消したいです ・ 適当にgsubを連ねる ・ gsub1個に超長い正規表現 どっちが妥当でしょうか
>>557 あーつまり
str.gsub(/ABC/,'').gsub(/DEF/,'').gsub(/GHI/,'').gsub(/JKL/,'').gsub(/MNO/,'')
と
str.gsub(/ABC|DEF|GHI|JKL|MNO/,'')
のどっちがいいかってことね
文句なしに後者
前者は正規表現作ってgsubして正規表現作ってgsubして正規表現作ってgsubしてが無駄
正規表現が長くて入り組んでてカッコばっかで超絶複雑で、
irbで試したら一発で落ちたとかいうのなら一考を要するけど
STDIN.methodsにはIOクラスで定義されていないメソッドは1つもないけど、その辺は流れ的にあえて黙っておいたほうがいいのかな?
>>559 どんな環境で使ってるんだ?
STDIN.openがあるのか?
それともIO.openが無いのか?
ちなみに俺のところでは
p IO.methods.sizeは94
p STDIN.methods.sizeは119あるぞ。
str.gsub( Regex.union(/ABC/, /DEF/, /GHI/, /JKL/), "")
>>560 頭を冷やせ
そして、
p IO.class, STDIN.class
しる
>>560 そうですか。
p STDIN.methods.size
(0..2).each {|fd| p IO.new(fd).methods.size}
クラスIO自体をselfとして呼ぶメソッド群と、 クラスIOのインスタンスをselfとして呼ぶメソッド群は、 当然違うわけだが。
>>554 取り敢えず
>>551 の
>> そりゃ別のクラスのインスタンスなんだから違っていて当然。
>の意味がお前さんには理解できていないように見受けられるが。
が理解できてないことはわかった…。
この程度の理解で偉そうに解説しないで欲しいものだ。
・IOはClassクラスのインスタンス
・STDINはIOクラスのインスタンス
ものが違うんだよ。たとえば
・''はStringクラスのインスタンス
・[]はArrayクラスのインスタンス
だったときに「''.methods.sizeと[].methods.sizeは違うよ!!!」と力説されても
「それは当然違うに決まってるじゃないですか」と答えるのと全く同じ意味で
>> そりゃ別のクラスのインスタンスなんだから違っていて当然。
と言ったんだけどな。粘着も何もお前さんが大嘘ついているから、
変な理解が流布しないように一所懸命間違いを正しているんだけどなあ…
あと p STDIN.methods.size, IO.instance_methods.size をしてみることをお勧めする。
>>562 飯食って頭が冷えた。
そして>>562-の言ってる通りの事を言ってるつもりが
まったく通じてないことがわかり落ち込んでいる。
違うものとわかってるから
ほらメソッド数が違うでしょ。だから違うものなんだよ。
と言ってるつもりだったのだが
同じものなのにメソッド数が違うのはおかしい
と言ってるととられていたのか。
>>557 gsubでの処理の順番によって結果が違う場合もあるから一概には言えない。
"ADEFBGHIC"に対して
>>558 のgsub処理を行うと消したいはずの
ABCが残ってしまう。
>>569 548も含めて全員「俺は全部きちんとわかってる。全部お前が悪い」っていいたいんだよ。
>>569 >>542 がSTDINのメソッドが知りたいって言ってるのに
STDINのクラスの見方を教えて
STDINがIOだとマニュアルの見方もわからない初心者が考える。
そこで
>>548 がメソッドの一覧の見方も教えてやれよ。
ほらIOとSTDINは違うだろ。似てるけど違うものなんだよ。
クラスはわかってるんだからあとは考えてね。
ってのを簡単に示したもの。
>>567 がわけわからん。
『俺の言ってることが誤解されて受け取られたようだ』といいたいんだろうけど、
それじゃあそもそもの
>>548 がどんな意図をもっていたのかわからん。
>>533 ,565の受け取り方が誤解というなら、
>>548 はどのように受け取ってほしかったんだ?
ここは初心者スレなのに、間違った回答や紛らわしい書き方が目立って困る。
しかもそれを指摘されたら逆切れしたり言い訳したり。おまえはTBSかと。
>>552 > IOクラスのメソッドが全部使えると思ってないか?
> IOクラスに載ってないメソッドがあることわかってるか?
>>554 > IOとSTDINのメソッドは重なる部分が多いが完全には一致していない。
> そしてIOにないメソッドがSTDINにはある。ここまでは良いよね?
まあこの辺の発言も考慮すると、IO.methods.sizeとSTDIN.methods.sizeだけ比べてみて、「あれ、STDIN.methodsのほうが少し多いぞw」とか考えたのではないかと思われ。
少なくとも、これら2つが「似て非なるもの」ではなく、「全く別物」だということに気付いていない様子は伺われる。
>>572 >
>>542 がSTDINのメソッドが知りたいって言ってるのに
>STDINのクラスの見方を教えて
>STDINがIOだとマニュアルの見方もわからない初心者が考える。
ここが謎。
あるオブジェクトが何のクラスのインスタンスなのか判れば、
そのクラスで定義されてるメソッドを見ればいいだろ。IOでいいじゃん。
STDINが参照するオブジェクトに特異メソッドなんて別に定義されてないし。
576 :
デフォルトの名無しさん :2007/04/16(月) 22:57:41
なんか、俺の質問で荒れてる・・・('A`) (荒れてるわけじゃないのか?) STDINは、IO派生してて別にメソッドもあるんですねぇ・・・
577 :
デフォルトの名無しさん :2007/04/16(月) 23:07:02
ところで、別の質問いいですか? <hoge moge="1234" hage="5678">・・・(以下長い文字列) のmogeの1234(数字で可変)だけ置換するエレガントな書き方はないですか? puts '<hoge moge="1234" hage="5678">・・・'.gsub(/(<hoge moge=")(\d+)(" hage=)/) { "#{$1}#{$2.to_i * 2}#{$3}" } だと、(<hoge moge=")とか(" hage=)がなんか、しょーもないなーって感じなので
>>577 HTMLに似てるのでHTML用語を使うけど、
そのmoge属性はhoge要素にしか出てこないの?
あと属性値を括るのはダブルクオートだけと仮定していいの?
肯定後読み先読みでできるかも?
>>577 puts '<hoge moge="1234" hage="5678">・・<hoge moge="1234" hage="5678">・'.gsub(/(<hoge moge="\d+" hage=)/) { $1.sub(/(\d+)/){"#{$1.to_i * 2}" }}
あんまりかわらないかな?
581 :
デフォルトの名無しさん :2007/04/17(火) 00:59:40
C#からrubyを実行したいのですが、可能でしょうか? (ruby_run();を実行したい) ruby_run自体実行した事が無いので、勘違い入ってるかもしれませんが、分かる方お願いします。
582 :
名無し@沢村 :2007/04/17(火) 01:21:15
>>582 おっ久しぶりにみたな。
ずっと姿を眩ませてたみたいだけど。
>>582 制限や奇怪な仕様が多すぎる…
これなら素直にCを使った方がいいような…
俺はアドレス見た瞬間に要らないと思った
REXML::Document.write("test.xml", 0) でファイルに書き出すと、 #<NoMethodError: undefined method `write' for 53000968:Fixnum> なエラーになるんだが、なんか情報ないですか? 環境: win2000sp4 ruby 1.8.5 (2006-08-25) [i386-mswin32]
587 :
586 :2007/04/17(火) 11:03:42
ちょ、間違えた。省略しすぎた。。。orz doc = REXML::Document.new(File.new("open.xml"), "r") doc.write(File.new("test.xml", "w"), 0) こんな感じで。
588 :
デフォルトの名無しさん :2007/04/17(火) 12:20:10
>>578 すみません。HTMLで仮定しているだけで、
文字列のある域だけにまっちし、その文字列の一部だけを書き換えたいというのをあらわしています。
>>580 gsub二重構造ですか、なるほど、その手があるか・・・
589 :
デフォルトの名無しさん :2007/04/17(火) 13:03:58
>>581 実行だけ6.0で作成したら良いんでない?
C#からはそのexeを実行する。
>>587 REXML::Document.newの引数はStringかIOであってFileではないが……
doc = REXML::Document.new(File.open("open.xml", "r"))
doc.write(File.open("test.xml", "w"), 0)
なら保存されたぞ。
File.openの返値を変数に持ってないため、明示的にcloseできないので、
exitすることによってcloseさせないとバファリングされたままだな。
うお、File は IOのサブクラスか!
592 :
デフォルトの名無しさん :2007/04/17(火) 22:24:26
EXE化でmkexyとexerbの二つをDOSのバッチにしたいのですが mkexy aaaa.rb exerb aaaa.exy をバッチの中身としたときにexerb aaaa.exyをやらないでバッチがおわってしまうのですが 続けて実行させるにはどうすればいいのでしょうか
594 :
デフォルトの名無しさん :2007/04/18(水) 00:28:52
>593 ありがとううごきました! ちなみに cmd/c mkexy aaaa.rb でも動いたのですが意味は同じなのかな。 そもそもなんで592だとmkexyはわざわざ次の命令をやらないように 作っているのでしょうか
大昔にDOSが「現在実行中のバッチファイル」をスタックして いなかった名残。バッチAから別のバッチBを呼ぶと、Aを実行中 だったという情報消えるのでBが終わった時点でバッチが終わる。
DOSバッチファイルの制限だな
mkexyの実体はexeでもcomでもなくmkexy.batというバッチファイルだ(この認識最重要)
バッチファイル内で普通にバッチファイルを実行するように記述すると
「戻って」来ることができないようになってる
だから
>>592 では「戻って」こないで1行だけで終了してるわけ
戻って来て次の行を実行したい場合はCALLするのが普通
CMDで新しいシェル起動して実行してもいいけど
>>594 > ちなみに cmd/c mkexy aaaa.rb でも動いたのですが意味は同じなのかな。
cmd /c だともう一個 cmd.exe のプロセスが起動する。
call だと呼び出しもとのバッチと同じプロセスで実行するので微妙に違う。
たとえば、呼び出したbatの中で環境変数とかを設定していると cmd /c だと
見えないけどcallだと見えるとか。
今回のケースならどっちでも大差ないと思うよ。
無駄にプロセスを起動しないcallでいいんじゃね。
>>596 > mkexy.batというバッチファイルだ(この認識最重要)
んだなす
だからバッチファイルの書き方の基本くらいは学んでおくといい
……のか? 何年前の技術よって感じだが
WSHで置き換わると何年も前から言われてるが全ッ然そんな気配ないな
WSHの次のやつなんだっけ?
>WSHの次のやつなんだっけ? Vista にも搭載が見送られた PowerShell 。 こいつもバッチファイルを駆逐できるだけの利便性はない。
スレ違いっぽくなってきたな。
話題は閉じただろ
class Log < ActiveRecord::Base end としていて、 Log.transaction { いろんな処理 Log.update(id, { :layer_id => layer_id, :layer_name => layer_name }) いろんな処理 } という処理があります。 たまに(頻繁に発生。必ずではありません) #<ActiveRecord::Transactions::TransactionError: Transaction aborted> なエラーにでて、 結果的に、 ruby/hoge.rb:212: [BUG] Segmentation fault ruby 1.8.5 (2007-03-13) [i386-mswin32] abnormal program termination で終了してしまいます。 updateする際の値はエラーチェックしたあとなので、きちんと設定されています。 update_attribute('layer_id', layer_id)との違いもよくわかりませんが、 なんでエラーになるかわかりますでしょうか?
>>598 > ……のか? 何年前の技術よって感じだが
mswin版のconfigureは今でもバッチだぞw
もっとも半分以上nmakeだがな。
604 :
デフォルトの名無しさん :2007/04/18(水) 16:13:51
すいません。macOS10.3を使ってて、バージョン1.6.6から1.8.2にしたいんです。 ホームページのソースからインストールで、最後にパスワード入力を要求されるんですが 全角だと入力できても、半角だと入力できません。どなたか分かる方いますでしょうか?
手強い
>>602 BUGと出る場合、たいていユーザーは悪くない。
JSONの勉強をする …なにやら楽しそうだが利用側のJavaScriptの書き方が眠いし面倒だしでさっぱりわかんね hashからsnippet経由でJSONに変換した時に限ってFirefoxでは動くのにIE6で動かね きっとつまんない初心者な理由で動作してないだけなんだろうが見当つかねわけわからんもう寝る知らね
そんなん言われても知らんがな Rubyを普段使うようになってからは JavaScriptはコピペの域を脱してなんとか自力で書けるようになったと思う
そこに書いてあるのはfor文をgrepみたいなリストに対してループする関数に 置きかえる話で、もろRubyならfor文(あまり使わんが)をイテレータに書き換え る話に見えるんだが。
これは、iteration をなんと訳すかによるな 「繰り返し」と正確に訳してしまうと for も each do も入っちまう 「数を数えるだけのループは本質的な枚挙に置き換えよ」ってことだろ
grepみたいな挙動を自分で書くことができるのも、rubyの特徴の1つですよね
普通の言語ならたいてい自分で書けると思うが
なんでも「Rubyならではの素晴らしさ」になってしまうんですよ Ruby信者のインナースペースでは
>>614 「rubyの特徴」→「Rubyならではの素晴らしさ」
なんだ、捏造かこれ。
煽り中失礼します よく考えたらRubyにあんま関係ない質問です 「引数のHTMLデータ(String)を解析し、決まったフォーマットのHashを返す」メソッドがあります Hashはbookdataという名前の変数に = で代入して利用することにします bookdata = mymethod(html) こんな感じです ちなみにHashのキーは著者とか書名とか出版社とかで、 htmlの対象となるWebページはたくさんあってmymethodは何回も使います mymethodの名前は何にすればわかりやすいですか? hash、makehash、html2hash、makedata、parse、parseHTML、booklist、getbookdata
html2bookdataかなあ。
一般的なやり方ではなさそうだけど、オレなら class Book def self.parse_html(html) # 今のところは Hash を返すよ # 将来的には Bookクラスのインスタンスに置き換えるつもり end end bookdata = Book.parse_html(html) クラス名が Book でいいかどうかは、プログラムの他の部分とのかね合いで。
>>616 HTMLを読むのが暗黙の了解ならparseとかto_hashでいいじゃん。
そのHash固有の処理があるなら、
>>618 のようにクラスにしたほうがいい気がする。
クラスにするなら俺はコンストラクタの引数にすりゃいいと思うが、好きに汁。
>>616 Amazonの詳細ページから書名や著者名を抜き出してハッシュを返すよとかそういう動作?
そのクラスで「ナニカからハッシュにする」というメソッドがそれ1個しかないなら
to_hashでいいじゃん?
parse_html_to_hash_as_bookdataとか長いし
>>615 捏造ではないですね
単に「カギ括弧でくくったからといってそれがすべて引用なのではない」だけです
「ならでは」はどこから来たの〜?
Proc#yieldってマニュアルに書いてあるけど、やってみたらそんなメソッドはありませんって言われたよ。 これはどういうこと?>ruby 1.8.5
特徴、から来ましたよ。 それがもしあなたのヒステリーに繋がるような面倒を引き起こす単語であるなら、 なんか別のものでも考えましょうか。
>>623 # を使った表記は文法上の表記ではなく
説明上の表記に過ぎない
エラーになるコード晒せと
irb>Proc.yield NoMethodError: undefined method `yield' for Proc:Class こんなエラーか? yieldは実行しただけで効果が見えて楽しいとかそーゆー類のメソッドじゃないぞ
628 :
623 :2007/04/20(金) 15:58:25
629 :
デフォルトの名無しさん :2007/04/20(金) 16:22:07
>>629 あら、なくなってたんですか。
それじゃProc#callで、引数チェックの回避は、*付きの配列にして頑張ることにします。
ありがとうございました。
Rubyをある程度覚えたら、 具体的にはどんなことに使えますかね? 特にwinユーザの方に聞きたいんですが、 どのようにRubyを活用されてますか?
>631 テキスト類の処理 dbi突っ込んでちょっとしたDB操作 使い勝手がよくわからんCOMモノの挙動確認(irbでちまちま叩いてみる) あと最近アフォみたいにでかいCSVを相手にすることが多かったんでfastercsvで万全
仕事のルーチンワークに メールで設計書を送らないといけないので フォルダのファイル名を全部取得して 圧縮して 定型文書いて メールを用意する までやっている。 自動で出してもいいんだろうけど、最後は人の目でチェック。
あなたがバッチファイルを書いたことがないのならおそらくRubyは使わない あなたがこれまでPerlを使ったことがないのならおそらくRubyを使うことはない 使いもしないものに時間割くのやめようぜ
Rubyを学んだとたん「仕事」が生まれるわけじゃないからな
ちょくちょく小遣いは稼がせてもらってるよ。
638 :
631 :2007/04/21(土) 00:13:10
レスありがとうございます。 >テキスト類の処理 テキストエディタの正規表現使った置換えで結構解決しちゃうんですよね >DB操作〜COMモノの挙動確認 なるほどこれは未知の領域 >CSVを相手に CSVの操作ならAccessでなんとかなるかなぁ >メールを用意する こういった処理はどのような形で実行すると便利ですか?(コマンドライン?バッチ?) >使いもしないものに時間割くのやめようぜ まったくもって・・・ でもなぜか面白そうと思ってしまったり
639 :
632 :2007/04/21(土) 00:16:16
即答したのにシカトされた。orz 俺の嘘偽りのないRubyの使い方なのに。
640 :
631 :2007/04/21(土) 00:17:34
>「仕事」が生まれるわけじゃない 仕事で楽をしたいですね >ちょくちょく小遣い 詳しく
641 :
631 :2007/04/21(土) 00:20:15
>>639 うは、ごめんなさいな。
まぁそうなりそうな予感はあります。
>>640 なんかエクセルでたくさんデータを持ってて、それをHTML化したいんですけどー、
なんて仕事がよくある。「ではデータベースにぶち込んでページ生成して」とかいっても、
「なんだかよくわからなくてこわい」とか言うんで静的にHTMLを生成してやるスクリプトを組んで
全ページと言われたとおりの一覧ページを作って収めたりする。
高すぎかなと思いつつ三十万円でいいっすか? といったらOKつったので喜んでやりました。
んで毎年一度更新があってそのたびに十万円もらえることになってる。
このときはスクリプトを走らせてできたものを相手に送るだけ。
こういうお客さんを数軒抱えている。いい小遣い稼ぎになってるよ。
643 :
642 :2007/04/21(土) 01:03:36
あーでもこれはRubyだからこそって例じゃあないよね。 別にPerlだってPythonだっていいもんね
別に自分にとって書きやすいなら、PerlだってPythonだって、 C++だって、Javaだって、C#だって、LISPだって、 なんだって、チューリング等価で好きな言語を使うがいいさ。
645 :
642 :2007/04/21(土) 01:43:12
いや、チューリングマシンでは書きたくないよw
> Procが参照している外側のローカル変数は、Procを生成したコンテキストを
> 抜けてしまったら最後、Proc以外からは参照できないから。
> :
> 厳密には抜け道はあるけれど、その場合はそうと分かるコードになるから大丈夫。
from
ttp://idm.s9.xrea.com/ratio/2006/11/14/000541.html ↑にクロージャ内に束縛したローカル変数を、
そのクロージャを介さずにアクセスする方法があると書いてあるんですが、
この「抜け道」というのは具体的にはどういう方法なんでしょうか?
>>646 eval使えば外部からローカル変数も操作できるってことじゃね?
def create_counter
counter = 0
Proc.new {counter += 1}
end
c = create_counter
p c.call
p c.call
p c.call
p eval('counter += 1000000', c)
>>631 筋はよさそうな言語に思えたが
INIファイルは弄れないわREGも駄目だわ
クリップボードにもアクセス不可だわで
標準ライブラリが貧弱すぎてほとんど使ってねーやw
素直にPythonかVB/JScriptかPython使っとけ。
ドザはこれだから
リソースキット他のツールと組み合わせて使うべし。 クリップボードの内容を変数に読む open("|cliputil -paste", "r") { |io| text = io.read } レジストリを読む open("|REG QUERY HKLM\Software\Microsoft\ResKit\Nt\Setup", "r") { |io| key = io.read } INIとかHTMLはパースして読み書きする
>>647 evalの第2引数にはprocも指定できたんすね。。知らんかった。
ありがとうございます。
>>648 registryは標準であるだろ。
ところでpythonって標準でini, registry, clipboardアクセスできるの?
win32all いれなきゃだめだと思ってたけど。
RubyはちょっとこったことやろうとするとWin32API呼びまくりになるのがマンドクセ
ネコに馬車引かせるような真似するな 馬車は馬に任せろ
655 :
デフォルトの名無しさん :2007/04/21(土) 15:44:45
大体Matzも「Rubyは快適な自転車を目指す」って言ってるしね。 言語はやはり適材適所でしょ。
具体的にどんな場面に適しているのか思い浮かばない。
シェルスクリプトより複雑な用途は 大体適してるんじゃね(Windowsはのぞく)
ていうか、使い道がないなら使わなきゃいいじゃん
今日はブックマークから不達になってるところを取り除くのに 書き捨てRubyスクリプトを使った。
研究用データを加工処理するのに使いまくってるな。
質問します。 今、配列 ary にキーが入っているとして hash = {} ary.each do |key| hash[key] = MyClass.new end ってワンライナーで書けないでしょうか?
hash = ary.inject({}){|h,k| h[k] = MyClass.new; h }
mysql で下のコードがうまくいきません。 meibo.uniq.each{ |val| db.query("insert into member(name) values (val)") naiyou.push(val) } naiyouの配列にはデータがあるのですが、DBへインサートできません。 (空データがはいります・・) どなたかご教授ください。
文字列のマニュアル嫁
とりあえずちゃんとSQL文ができてるか確かめてみろ puts "insert into member(name) values (val)"
666 :
663 :2007/04/21(土) 22:19:28
>>664 >>665 ありがとうございます!
("insert into member(name) values ("+ name + ")" )
で解決しました。
なんかスマートじゃない感じが。
667 :
デフォルトの名無しさん :2007/04/21(土) 22:25:28
演算子に === や <=> があるのですがどういう機能なのでしょうか
>>666 ------------------------
str="もじれつ"
puts "strの中身はstrだよ"
strの中身はstrだよ
------------------------
str="もじれつ"
puts "strの中身は" + str + "だよ"
strの中身はもじれつだよ
------------------------
str="もじれつ"
puts "strの中身は#{str}だよ"
strの中身はもじれつだよ
------------------------
>>666 ("insert into member(name) values (#{val})" )
>>667 どっちも基本的に裏側で使う。
===:
case文で case a; when b とあるときに b === a として使われる。
大抵は==やkind_of?の働きをする。
<=>:
大小に従って -1, 0, 1 のいずれかを返す。比較不可ならnilを返す。
sortなどはこれを実装してないと動いてくれない。
・・・と期待されている。(全部メソッドなので定義は自由)
671 :
670 :2007/04/21(土) 22:40:31
===がぜんぜん違った。falseかtrueかnilだ。ごめん。
672 :
666 :2007/04/21(土) 23:07:01
>>668 >>669 ありがとうございます。
変数展開がすっきりしました。
puts ("insert into member(name) values (#{val})" )
db.query("insert into member(name) values (#{val})" )
をするとエラーになります。
Mysql::Error
Unknown column 'なまえ' in 'field list'
デバッグプリントしたものをSQLコンソールで
insert into member(name) values ('なまえ')
すると正常にテーブルに書き込まれます。
うーん、解らない・・
674 :
666 :2007/04/21(土) 23:44:57
db.query("insert into member(name) values (#{val})" ) ではなく db.query("insert into member(name) values (\'#{val}\')") でうまくいきました。 プレースホルダはできないのかな?
valが既知ならいいけど、外部から貰ってきたりすると #{}で展開するのはもろにSQLインジェクションの餌食だからねぇ。 生のRuby/MySQL API的には、quote / escape_string というメソッドで 安全にしてから埋め込めということらしい。 DBI版だとプレースホルダあるけど。
676 :
666 :2007/04/22(日) 01:00:10
>SQLインジェクションの餌食だからねぇ。 ですよね。 quote / escape_stringを使ってみます!
>662 なるほど…inject は盲点でした。 というより、inject はいつも盲点で、上手く使える方が羨ましい… ありがとうございました!
elseとifが合体したのはelsifですが、elseとunlessが合体したものってありますか?
execで外部プロセスを実行するときに 拡張子に関連付けされているアプリケーションを 自動的に選択したいのですがどうすれば良いでしょうか? foo.txt があった場合に メモ帳が関連付けされているならメモ帳 秀丸が関連付けされている場合なら秀丸で開く そういう動作を期待しています
require 'Win32API' shellexecute = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i') shellexecute.call(0, 'open', 'foo.txt', 0, 0, 1)
`start foo.txt`
>>680 こんな事ができるんですね。
ありがとうございます
何をしてるのか理解するのに
1時間ぐらい掛かりましたがなんとかわかりました。
>>681 exec('start x:\foo.txt') だと
sh: start: command not found
exec('start x:/foo.txt') だと
test.rb:11:in `exec': No such file or directory - start x:/foo.txt (Errno::ENOENT)
のエラーになってしまいました。
その位置にファイルがあることは確認しています
startはdirのようにコマンドプロンプトの内部コマンドなのかな。 もしそうなら cmd.exe /c start 〜 かも。
cmd /c foo.txt だけでもちゃんと関連付けにしたがって開けてくれるっぽい
windows環境で globを用いて Unicode の ファイル、フォルダ名を扱うことは出来ますか? ruby -Ku $KCODE = "UTF8" を指定しても Unicodeを含むパス情報を取得できませんでした
>>678 elsif(! (b)) しかないなあ。
あるいは、
elsif(b); else
か。
unless foo elsunles bar end とかやられても意味わからんし・・・w
690 :
デフォルトの名無しさん :2007/04/22(日) 15:08:41
injectのブロックって do 〜 end で指定できないの? >ruby -ve "p [1,2,3].inject({}){|h,k| h[k] = k; h}" ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] {1=>1, 2=>2, 3=>3} >ruby -ve "p [1,2,3].inject({}) do |h,k| h[k] = k; h end" ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] -e:1:in `inject': no block given (LocalJumpError) from -e:1:in `each' from -e:1:in `inject' from -e:1
691 :
690 :2007/04/22(日) 15:26:53
>>690 すんません、自己解決。
ってゆうか、これから出来るってのは確認した。
なぜかはイマイチ不明だけど。なんかの優先順位の関係?
>ruby -ve "p([1,2,3].inject({}) do |h,k| h[k] = k; h end)"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}
>ruby -ve "[1,2,3].inject({}) do |h,k| h[k] = k; h; end.inspect.display"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}
>ruby -ve "a = [1,2,3].inject({}) do |h,k| h[k] = k; h; end; p a"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}
いまのところ、{}とdo endは優先度が違うね。 同じにしようという声もあったと思う。
いつどこで?
695 :
デフォルトの名無しさん :2007/04/22(日) 16:31:28
>>686 関連して、Windows環境で、日本語フォルダがglobで列挙できないことがあるのが、
なんとかならないかなあ。
なんか、過去ログにも誰か同じ問題聞いてた気がするけど。
再現コード書いてみるか・・・
696 :
デフォルトの名無しさん :2007/04/22(日) 19:33:16
>>695 #!ruby -Ks
require 'pp'
puts "$KCODE = #{$KCODE}"
puts
FILES = [
"test",
"ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああ.mpg.txt",
"表が怖い",
"噂のソフト",
"ハニリイト"
]
# create files
FILES.each do |file|
next if File.exist?(file)
open(file, "w") {|f| f.write file}
end
=begin
697 :
デフォルトの名無しさん :2007/04/22(日) 19:34:22
=end # glob test Result = Struct.new(:name, :is_enumerable, :size) results = Array.new(FILES.size) do |i| Result.new(FILES[i], false, FILES[i].size) end Dir::glob("*") do |f| i = FILES.index(f) if i result = results[i] result.is_enumerable = true end end # print result results.each {|result| pp result } ------------- 結果、test以外どれも列挙できない。 これ、かなり致命的だと思うんだけど、どこに報告すればいい?
698 :
デフォルトの名無しさん :2007/04/22(日) 19:35:24
>>695 インデントくずれた orz
#!ruby -Ks
require 'pp'
puts "$KCODE = #{$KCODE}"
puts
FILES = [
"test",
"ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああ.mpg.txt",
"表が怖い",
"噂のソフト",
"ハニリイト"
]
# create files
FILES.each do |file|
next if File.exist?(file)
open(file, "w") {|f| f.write file}
end
=begin
699 :
>>698 続き :2007/04/22(日) 19:37:42
=end # glob test Result = Struct.new(:name, :is_enumerable, :size) results = Array.new(FILES.size) do |i| Result.new(FILES[i], false, FILES[i].size) end Dir::glob("*") do |f| i = FILES.index(f) if i result = results[i] result.is_enumerable = true end end # print result results.each {|result| pp result }
700 :
698 :2007/04/22(日) 19:39:15
手元の環境では、$KCODE=SJISです。 $KCODE=SJISでないと、「表が怖い」とかのファイル名が生成時に化けるので注意です。
うーん、長すぎるファイル名(ああああ...)がFindNextFileを失敗させてるねぇ。 GetLastErrorを見てないから、そこで列挙が止まっちゃう、と。 win32/win32.c 1505: while (FindNextFile(fh, &fd)) { を 1505: while (FindNextFile(fh, &fd) || GetLastError() == ERROR_MORE_DATA) { にすればとりあえず(あああ...)以外はtrueになるけど
702 :
698 :2007/04/22(日) 21:16:19
>>701 長すぎる文字列が失敗させているんですかね?
と思って、ああああをコメントアウトしてみたんですけど、
Falseになるな・・・
ファイルは消した?
704 :
698 :2007/04/22(日) 21:19:51
>>702 ああああああのファイル消し忘れてた orz
あああああをコメントアウトして、ファイル消したら、trueになりました。
確かに、あああああああああ だけが悪影響を与えているようですね。
表が怖い、噂のソフトは、一見文字化け絡みでFalseなのかと思われたが、関係ない。
705 :
686 :2007/04/22(日) 23:39:41
何度もすいません globを使わなくて良いので 特定のディレクトリ配下にあるファイル名を Unicodeに対応して取得するにはどうすれば良いのでしょうか?
>>705 require 'kconv'
ret = Dir.glob("特定のディレクトリ以下/*").map{ |f|
f.kconv(Kconv::UTF8, Kconv::SJIS)
}
話をぶった切ってすみません。 最近rubyをemacsで書き始めたのでruby-mode.elを入れました。シン タクスハイライティングはできたのですが、オートインデントはど うしたらいいんでしょう? 前に使ってたRDT(だったかeclipseのやつ)はコードを後から自動 整形する機能があったんですが、そういうのってemacsでも可能でしょ うか?
すれ違い
・TABキーを押すと、カーソルがどこにあっても適切なインデントを行う。 (インデントすべきところをしていなければするし、しすぎていれば戻す) ・C-j (M-x ruby-reindent-then-newline-and-indent) を使うと、 改行後にインデントを行う。(RETURNでそうしたいならC-mにバインド) ・ファイル全体のインデントは C-x h (M-x mark-whole-buffer) してから C-M-backslash (M-x indent-region)
>>710 に付け加えて
字下げの契機になる行(メソッド開始のdefがある行とか、ifの行)に
カーソルを持って行ってM-C-qでそのブロック内のインデントを調整
>>710 , 711
ちゃんと色々あるんですねー。感動しました。
これならガシガシ使っていける気がします。
常識/スレ違い失礼しました!
皆さんRailsの開発環境って何使ってますか?
>>714 Emacs + emacs-rails
2GB以上のファイルサイズが正しく収得出来ないんですけど なにかいい方法ありませんか?
>>718 今XPなんですけど
たとえばLINUX上からNTFSをマウントすれば
Rubyは正しいファイルサイズを返すんですか?
それならVPCになにか入れてみようかな。
FindFirstFileでも呼んどけ 挙動がおかしかったらWin32API直呼び。マジお勧め
KCODEがutf8ならW系APIを読むように win32.cでも改造してみるか(w
>>719 今のところWindows版のlarge file supportは1.9のみ。
Rakeの作者のブログにこんな話がありました。。 desc "This task will do something" task :do_something do ... end というコメント書式は格好よくないから -- "This task will do something" task :do_something do ... end みたいにしようかなー(Ada + Smalltalkぽい) こうしたらできるし class String def -@ desc self 0 end end で、質問です。上のコードのdef -@の部分ってどういうシンタクス ですか? 関数定義部の@には何か特別の機能でもあるのでしょうか? (ちなみにRakeのコメント書式を実際に上のようにすることは思い とどまったそうです。)
単項マイナス演算子を定義するときの専用表現。
>>725 ありがとうございました。分かりました。
超基本的な質問ですみませんでした。
727 :
デフォルトの名無しさん :2007/04/23(月) 23:27:14
ruby/tkで将棋を作ってみたいんですが、 参考になるコードはないでしょうか。 検索していると、オセロのコードが昔はあったようですが 今は入手不可のようです。 GUI部分がどうしても上手く作れないのでよろしくお願いします。
>>727 「14歳からはじめるRuby」って本にオセロの作り方のってたぉ
14歳はだいぶオーバーしてしまったが、この本は分かりやすくていいw
Rubyの「$KCODE」って名前が好きになれないんだよな。 先進のオブジェクト指向だとか言ってて国際化はi18nではくl10nかよと。 単なるオーバーライドで$KCODEも有効で良いから$LANGとぁ$LOCALEに ならんのかね? ちなみにnkfとかktermとかjcodeなんてえのも嫌い(名前が)。 もう主要OSはこぞってUnicode系になってるんだし。
日本語フォルダなんて使うのが、面倒な原因だと思うけどな。 マクだとツールボックスだかのマカ専用API直呼び出しなのだろうか。 なんかその辺の環境依存的なプログラミング手法(ヲレ関数で包めとか)を決めて推奨したほうが後で揉めるより良いと思う。 ところでAとBがあって、 1) A == B 2) A < B 3) A > B の3パターンの処理を行う時って、おまいらならどう記述する? if A == B then ... elsif A < B then ... elsif A > B then ... end ってなんか見た目分かりにくくていまいちな気がするが、どうよ?
>>730 俺ならそれは
case
when A == B
when A < B
when A > B
end
になるな
ヲレロケールとヲレラングで包めば良いのでは? ヲレi18nでいいじゃん。 まだRFCではメールはiso2022jpダッタと思う。utf8になってたっけ?
>>730 case A <=> B
when 0
...
when -1
...
when +1
...
end
で、実際のところどれが速いの?
caseなら変わらないのでは? 記述の違いだけだろうし。
実行ボトルネック上に実質的な差はないと思う ココをチューニング対象にするならCで書き直したほうがいい
738 :
デフォルトの名無しさん :2007/04/24(火) 13:20:15
> 日本語フォルダなんて使うのが、面倒な原因だと思うけどな。 世界の人、全員がプログラマならそういえるんだけどな。
>世界の人、全員がプログラマならそういえるんだけどな。 んなのかんけーねーよ。 音楽CDとかの分類にもはや必須だから 避けろといってるほうがアホ。 Rubyの糞実装を糊塗するために珍説振りまかないように。
↑読解力に欠けたバカ
ということにしたいけど、うまいこじつけは思いつかなかった740
>>741 お前アホすぎw 738をよく読めよw
2回指摘されて分からなかったら日本人じゃねぇよw
別にどうでもいいや。どっちもバカってことで。
悔しいからって別人の振りして「どっちもバカ」って本当にアホすぎだな。 どうでもいいならそもそもレスしないだろ。
>>744 日本語が分からないお前が一番かわいそうだよ…
ダウンロード販売の音楽ファイルも最近は英数が多いけどな。 MP3タグだけ日本語表示で良いじゃん。
ま、いまだにフォルダで管理とか原始的なことやってるんだからしょうがないんじゃね?
>ダウンロード販売の音楽ファイルも最近は英数が多いけどな。 ヨーロッパの音源だとUNICODEが多かったりするんだが。
英数が多い、の反論として Unicodeが多い、とか意味不明じゃないか。
751 :
デフォルトの名無しさん :2007/04/24(火) 19:57:51
結論 ASCII以外はRuby非推奨 英語圏以外はRuby非推奨
>>750 Rubyが糞なのでファイル名は英数にして、タグに日本語名つけて回避しろとか抜かしているわけで。
まぁ信者の心持ちとしては正しいといえるかもしれないね。 でも、「Ruby様に合わせて、コレとかアレとかソレは頑張って避けるようにしましょう」ってのは、 信者以外には通用しない話の持って生き方ではある。 布教マニュアルに不備があるというところかね。
>>754 カルト宗教としては押し付けは普通だろう
756 :
728 :2007/04/24(火) 20:49:57
>>733 それです
初心者向けだけど、参考になるかもです
>>753 はぁ?お前のそのレスも、
ヨーロッパの音源だとUNICODEが多い、
が意味不明という反論になってないけど?
758 :
デフォルトの名無しさん :2007/04/24(火) 21:37:21
本スレの流れを持ち込まないで下さい
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] で require "open-uri" できねーのですが
open-uri.rb自体はあるのか? $: の値はどうなっているか? 出来ないと判断した際何かメッセージは出たか?
761 :
デフォルトの名無しさん :2007/04/25(水) 02:05:51
環境
D:\Programming\koshi>ruby -v
ruby 1.8.5 (2006-12-04 patchlevel 5000) [i386-mswin32]
目的
Ruby's WWW::Mechanizeを使いたい
http://mono.kmc.gr.jp/~yhara/w/?Ruby-WWW-Mechanize やったこと
WWW::MechanizeのtgzをDL、ruby setup.rbでインストール OK
WWW::Mechanizeのサンプルを実行したら、require 'rubygems'でエラー
D:\Programming\koshi>ruby spider.rb
spider.rb:3:in `require': no such file to load -- rubygems (LoadError) from spider.rb:3
'rubygems'のzipをDL、ruby setup.rbでインストール NG
zlib.dllがありません ダイアログが表示された
やるきなくした
762 :
デフォルトの名無しさん :2007/04/25(水) 02:23:52
>>761 Rubyは何で入れた?
OneClickInstallerで入れろ。
gemsも入る。
gems入る→gem install mechanize で mechanize も入る → 終了
Rubyでライブラリ入れるときは、基本gemsで入れるから、
gemsは入れとけ
763 :
デフォルトの名無しさん :2007/04/25(水) 02:57:05
Ruby Quiz
http://cuzic.net/ruby-quiz/ruby-quiz011.html を見ているのですが
ここの、第3問 の答えって間違ってませんか?
def do1 a; a.concat [2,3]; end
def do2 a; a = a + [2,3]; end
a1 = a2 = [1,2]
do1(a1);p a1 #=> [1,2,2,3]
do2(a2);p a2 #=> [1,2,2,3] ←ここが違う
do2(a2);p a2 は、[1,2,2,3,2,3]になると思うのですが・・・
日本語フォルダが扱えない馬鹿は英数で回避すればって教えでしょ。 教えを守れない香具師は、パールでも好きな宗教に趣旨替えすれば良い。 ユニコードの英数部分ってアスキーとコンパチで実にうまく出来てたりするしねえ。 だから欧米は、アスキーもユニコードも大差なく扱える。結局は英数使っとくのが楽。 日本語の読み書きできないなら、英語で読み書きすれば意思疎通できるよって話。 日本語の読み書きしたいなら、日本語の勉強と(rubyでも)日本語を扱う方法の勉強をすれば良い。
execとsystemと``の違いは何でしょうか?
766 :
デフォルトの名無しさん :2007/04/25(水) 05:58:54
RubyがPythonに取って代わられたのは闇の組織が関係していると思われます。 皆さんはご存じないかもしれませんが、Rubyは光の組織と関係があるのですよ。
>>763 その中で、ひとつだけ他とIDが違うArrayオブジェクトがあるんだが、どれかわかるか?
Array#concatは新しい配列を作らずに既存の配列に追加する。
でも、array = array + [なんとか] は
既存の array と [なんとか] を結合して新しい配列オブジェクト array を生成する。
ここのイコール記号は「足して既存の配列に書き戻す」ような動作に見えるが、Rubyでは違う。
似たような勘違いに属する、直感に反する例としては、
i=0
10.times do
i += 1
puts i.object_id
end
3
5
7
9
11
13
15
17
19
21
こんなんもある。+= するたびに新しいオブジェクトになってる。
答になってなかった。あーつまりだな def do2 a; a = a + [2,3]; end これの左辺の a は「新しい」 a で、誰からも参照されてないんだよ。 do2 では 引数の a は変化してない。 def do1 a p a.object_id a.concat [2,3] p a.object_id end def do2 a p a.object_id a = a + [2,3] p a.object_id end a1 = a2 = [1,2] do1(a1) p a1.object_id p a1 do2(a2) p a2.object_id p a2 これに書き直して動かしてみな。do2の最後で表示する5つ目のIDだけが違うはずだから。
ここ初心者スレだっけ… 原因は = というよりは + だと思う マニュアルには「内容を繋げた新しい配列(や文字列)を返します」とかしれっと書いてあるが 新しいオブジェクトを作って返します と明示的に書いて欲しいもんだ よく言われるけど、「足す」だけなら concat や << の使用の検討をお勧めする return デカい文字列1 + デカい文字列2 だと超デカい第3の文字列ができてしまうが return デカい文字列1 << デカい文字列2 だとでかい文字列1が超デカくなるだけなのでこちらのほうが一般的にはマシ (ただし、デカい文字列1の指すオブジェクトの中身が変化してしまうのでそのへんは注意) << や concat は初心者の人にイマイチ受けがよくないんだが、使い分ける癖はつけたほうが後々お得
771 :
デフォルトの名無しさん :2007/04/25(水) 13:02:06
>>769 うーん、うまくいかない・・・
> ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]
def do1(a)
puts "do1 a.object_id = #{a.object_id}"
a.concat [2,3]
p a
puts "do1 a.object_id = #{a.object_id}"
end
def do2(a)
puts "do2 a.object_id = #{a.object_id}"
a = a + [2,3]
p a
puts "do2 a.object_id = #{a.object_id}"
end
a1 = a2 = [1,2]
do1 a1
puts "a1.object_id = #{a1.object_id}"
p a1
puts
do1 a2
puts "a2.object_id = #{a2.object_id}"
p a2
772 :
デフォルトの名無しさん :2007/04/25(水) 13:03:44
do1 a.object_id = 21719210 [1, 2, 2, 3] do1 a.object_id = 21719210 a1.object_id = 21719210 [1, 2, 2, 3] do1 a.object_id = 21719210 [1, 2, 2, 3, 2, 3] do1 a.object_id = 21719210 a2.object_id = 21719210 [1, 2, 2, 3, 2, 3] になってしまう・・・
773 :
デフォルトの名無しさん :2007/04/25(水) 13:04:43
あ、ごめww > do1 a2 > puts "a2.object_id = #{a2.object_id}" > p a2 do2 a2だった・・・ こうすると、ちゃんと、do2の最後だけ違いますね do1 a.object_id = 21719210 [1, 2, 2, 3] do1 a.object_id = 21719210 a1.object_id = 21719210 [1, 2, 2, 3] do2 a.object_id = 21719210 [1, 2, 2, 3, 2, 3] do2 a.object_id = 21718210 a2.object_id = 21719210 [1, 2, 2, 3]
class Module def attr_boolean_accessor(*names) names.each { |name| module_eval <<-EOF def #{name}?; @name; end def #{name}=(val); @name = !!val; end EOF } end end こういうのが標準で欲しいなあ。
loop_with_index が標準で欲しいなあ。
2chの要望は絶対に受け入れられないの法則
にちゃんには開発者は居なくてユーザだけだからね。 彼らはメール読んだりオフ会に出てきて話して飯食ったりにちゃん読んだりするより、プログラム書いてる方が楽しい人たちだし。
「わかったふり」なんか受け入れても意味ないしね。 受け入れて欲しかったら、もうちょっと修行を積んで、まともな案を出せるようになればいい。
にちゃんはMLとかオフ会で話せない愚痴を書く場所だからなぁ
でも初心者スレは質問とか回答する場所じゃね? 愚痴は本スレやモルモンスレの方が適切かと
>>765 system
引数のプログラムを実行する。
単に他のプログラムを実行したいならコレ。
``
ほぼsystemと同じだが、実行したプログラムの標準出力の内容を文字列とし
て返す。
exec
自プロセスで動かすコードを置きかえる。
最後だけ分かりにくいだろうな。
今自プロセスではRubyインタプリタが何らかのスクリプトを実行している
(そこにexecが書いてある)わけだが、execすると、プロセスに搭載している
コード(=Rubyインタプリタ)の代わりに別のコードを実行する。
動いているコード自体をすげ替えるので、execに成功すると、exec先で終了
しても、再びRubyインタプリタに戻って来ることはない。
forkしてexecというUNIXのプロセス生成&実行の仕組みは学んでみると
面白いかもよ。
Hash#eachなどのブロック内で自分自身の値を変更するようなイテレータはありませんか? 見つからないので今のところ temp = {} hash.each{|k,v| temp.store(k,do_hoge(v)} hash = temp と代用しているのですが、なぜだか涙が止まりません。
>>781 exec 'notepad.exe'
p 'notepad closed'
ってすると "notepad closed" が表示されないのを確認しました。
何に使うんだろうと思いましたが、UNIXやLinux系の流儀ですか…
機会があったら学んでみます。
ありがとうございました。
>>783 「forkして」を読み飛ばしてるだろ
そこがミソなんだよ
>>782 言われてみれば Hash#map! は無いんだな
hash.each {|k
v| hash[k] = do_hoge(v) }
あたりで。変態的な方法としては
hash.merge!(hash) {|k
v1
v2| do_hoge(v1) }
とかどうよ
786 :
785 :2007/04/25(水) 22:09:19
ごめん書き直し。 > hash.each {|k > v| hash[k] = do_hoge(v) } hash.each {|k, v| hash[k] = do_hoge(v) } > hash.merge!(hash) {|k > v1 > v2| do_hoge(v1) } hash.merge!(hash) {|k, v1, v2| do_hoge(v1) }
>782 あまり美しくないが、 hash.merge!(hash){|k,v| do_hoge(v)} とかかな。 Hash#map! をこの定義にしておくと幸せになれそうだが……。 class Hash def map!() self.merge!(self) {|k,v| yield(k,v) } end end
788 :
787 :2007/04/25(水) 22:09:57
あら、かぶっちゃった。
たしかwindowsのrubyは、cygwin版にしかforkがないんだよな。
def func= #なんだかの処理 end 上記のような関数を作ったところ、エラーにはなりません しかし、 func= と書いても、 func=適当な値 と適当な値を入れてもエラーになります def func= end みたいなメソッドは定義できるのに使用できないのでしょうか? すなおに def func end と書けとは言わないでください 実験してみたところ、?とか!は質問形式や、レシーバに変更を与えない場合につけてもなんとも無いみたいですが、=だけは別なのでしょうか?
$ cat test.rb def func= puts "func= is called" end func=1 $ ruby test.rb $ 何もエラーは出ない。 ただし、メソッドfunc=が呼ばれるのではなく、 ローカル変数funcへの代入が行われている。 どんなエラーになるの? =付きのメソッドが作れるのはアクセサ関係のせいだろう。
インスタンスメソッドの場合はこうなる。 class Hoge def func= puts "func= is called" end end hoge = Hoge.new hoge.func=1 test.rb8:in `func=': wrong number of arguments (1 for 0) (ArgumentError) from test.rb:8 obj.method=arg の形は obj.method=(arg) と解釈されるので、method=は引数を1つとる 形で定義されていなければならない。
793 :
705 :2007/04/26(木) 06:36:34
>>706 試してみましたがUnicode部分が????になってしまいます
やはり
>>721 さんが言われる通りWin32API呼ぶしかないんでしょうか?
>>791-
>>792 レスありがとうございます
たしかに、func=5とobj.func=5で動作違いますね
>>791 さんの言うとおりそれだと、エラーが出ませんでした
しかし、私は
>>792 さんのように書いていたので、
>>792 さんがお書きになられたエラーがでました
ただし、
>>791 の場合でもself.func=5とか書くとwrong number of arguments (1 for 0)になってしまいます
代入演算子=の挙動は
func=
と
obj.func=
でちがうのでしょうか?
マニュアル熟読すればわかるのでしょうか?
ちょい、質問 メソッド内のクラスおよびモジュールの定義はなぜ禁止されてるんだ?(あまり、必要ないと言えば無いが、クラスは必要あるときもありますよね) あと、シングルトンのクラスだけはOKて本当か? なんで、そんな風になっちまったんだ?
>>794 def func= x # Kernelモジュールのインスタンスメソッド
puts "func= #{x}"
end
self.func = 1 # selfはmain(Objectクラスのインスタンス)
>>795 たぶん君の必要としている「メソッド内のみのクラス」はシングルトンメソッド(特異メソッドのこと)でほぼできる。
デザパタのシングルトンじゃないでしょ。
>>785 ,787
ブロック内部で呼び出し元?のハッシュを上書きするのは
なんだか変態チックなのでmerge!を使うのがよさそうですねー。
ありがとうございます。
Singletonのメリットがよくわからない class Hoge include Singleton def fuga() end end Hoge.instance.fuga これは class Hoge def self.fuga() end end Hoge.fuga とかけばいいんじゃないの?
シングルトンは、インスタンスがたかだか1つであることを保証するもの。 インスタンスを全く作る必要がないケースなら不要。
俺は>798じゃないがJavaの時から「要るのかこれ?」って疑問はあるな。 (Javaもクラスフィールド・クラスメソッドは使える) インスタンスが1つであることを保証するなら 別にインスタンス作る必要も無いんじゃねーの?ってさ。
JavaとかC++だとクラスをオブジェクトとして扱えないからたまに必要かな Rubyじゃいらないな
機械的に何度もnewを呼ばれるようなプログラムで便利とかそういうもんなんだろうと思って シングルトンの項は流し読みしてたんだがなにかマズいんだろか
rubyってコンストラクタ(initialize)オーバーロードできないの? クラスで def initialize(x) end def initialize(x, y) end ってやって X.new(a)ってやったら引数が足りないって怒られたんだけど。
テストとか作ってる人いる? やっぱできるようになると開発効率違う?
>>803 そもそもRubyはオーバーロードが無いから
その定義はオーバーライド扱い。
その場合、子クラスのinitializeは
引数1つでも2つでも良いように定義して
引数1つなら親クラスのinitalizeを呼ぶようにすればOK。
>>800 Javaではクラスインスタンス変数は使えない。
マヌケな質問でしたらすみませんが、 インスタンスのフィールドを「追加」不能にする方法はありますか? 何がしたいのかというと、 スペルミスが原因で フィールドの変更をするつもりが フィールドの追加になってしまう、 という状態を避けたいのです。 そこで initialize で フィールドの初期化だけでもしておいて、 最後にインスタンスへの フィールド追加を不能にできれば…と思いました。
ユーザーに自由にRubyコードを追加させるとかそういうアグレッシブなスクリプトか何かか?
>>811 そんなことは無理だと思うけど、set_trace_funcを使えばできなくもない気がする。
set_trace_funcについてはマニュアルを見てくれ
814 :
811 :2007/04/29(日) 09:55:45
>>812 いえいえ、そうではなく例えば…
class Class1
def initialize
@count = 0
end
def do_something
if ...
@conut = 0 #スペルミス!!
end
end
end
という時に実行時エラーなどで、
自動的にスペルミスが発見できるような
仕組みが欲しいのです。
そのために利用できるフィールドは全て
initialize で初期化して、それ以外はエラーに
できないかな、と。
>>813 set_trace_func についてどうもです。
まだ Ruby 始めたばっかりで
どう使うのか分かりませんが勉強します。
815 :
811 :2007/04/29(日) 09:57:01
あ、インデントが…orz class Class1 def initialize @count = 0 end def do_something if ... @conut = 0 #スペルミス!! end end end です。
諦めてテスト書きまくってあとはエディタの補完つかえばいいよ
>>811 できなかないが、
それがやりたきゃrubyを使うなという類の要望だな。
変数の明示的宣言を極力排除するというのがmatzのある種のこだわりであり
rubyのアイデンティティでもある。
Rubyのコンセプトではないし、本質的に考えてもそのスクリプト自体に負わせる仕事でもないよな 「そのスクリプトが正しいか調査するスクリプト」を作って本番稼動前に通せば用は足りる ということでTestUnitでも作れ あとコード補完機能のあるエディタでも使え
p hoge if $DEBUG とかが大量にあるスクリプトは無駄だし作り方としてもイカンよな でも楽なんだよ
def なんとか (foo,bar,baz) = Array.new, Array.new, Array.new foo = 10文字位のメソッドチェーン bar = 10文字位のメソッドチェーン baz = 10文字位のメソッドチェーン : : end これって 「(foo,bar,baz) =Array.new, Array.new, Array.new の部分いらねーよバカ」 って思われる確率高いですか? fooとbarとbazは名前から配列オブジェクトだということは見当がつきません
高い
>>820 型についての情報を記述したいということかな?
その書き方だと混乱する人が多いと思うから
# foo, bar, and baz are array
とコメントするか、
arr = 10文字位のメソッドチェーン
foo = arr
とするのがよろしいかと。
>>820 明らかに無意味。
Array.newで初期化したからって他のものを代入できなくなるわけではない。
> fooとbarとbazは名前から配列オブジェクトだということは見当がつきません
配列かどうかが重要ならそういう名前にしろ。
でももっと重要な意味があるならそっちを優先しろ。
>>814 スペルミス対策ということなら、直接 @var を使わずに self.var と self.var= を使えばいいんじゃないかな。
これなら実行時にエラーが出る。
accessorを定義していない場合は使えないけど。
便乗だけど、じゃあ「与えられた配列からHTMLのテーブルを作って返す」メソッドで def hoge_table(arr) html=String.new html << '<table>' … end とか書くのも読みにくいなと思われてる? html='<table>' から始めたほうがいい?
String.new とか Array.new とか Hash.new とかは普段使わないほうがいいよな なにか特別な目的があって初めて使う程度がいいかと思われ いちいち hoge = String.new とか hoge = nil とかしなくても = で指した瞬間から「そのオブジェクトだけをさししめすあたらしいへんすう」になるわけだし、 Ruby では明示的に new する積極的な意味はない、と思う 個人的にはいちいち new したくなる気持ちはわからんでもないんだが
俺も、なんかinitializeあたりで明示したくなるんだよな
String.newと書くくらいなら
html = ''
と書くなぁ。
>>825 に限れば、erbを使えば、
erb = ERB.new(<<EOF, $SAFE, '%')
<table>
% ary.each do |a|
<tr><th><%= a[0] %></th><td><%= a[1] %></td></tr>
% end
</table>
EOF
return erb.result
みたいなのでもいけるかな。
てゆーか、新しさを醸し出すならせめて str = String.new('ほげほげ') とか arr = Array.new([1,2,3,4,5]) # <ruby 1.7 feature> とか書いて欲しい そうすればなんとなく伝わるぞ たぶん 無駄さ加減も際立つので、これを続けてればある日から書かなくなる…と思う
830 :
デフォルトの名無しさん :2007/04/29(日) 14:19:29
マッチした数というのはどうやって得られるのでしょうか? 例えば、hoge moge foo bar hoge mage という文字列があって、hogeの数を知りたいのですが
>>827 ・ そのクラスに存在するインスタンス変数は initialize で全部 new する
・ そのメソッドで return する変数は def の直後に明示的に new する
病気
832 :
デフォルトの名無しさん :2007/04/29(日) 14:25:06
/hoge/i =~ "hoge moge foo bar hoge mage" p $~.size だと、1になってしまいますよね?
メモリ効率を気にしないでいいなら str.scan(/hoge/).size 数を数えるためだけに配列が作られるのが嫌なら count = 0 str.scan(/hoge) { count += 1 } # ゼロで初期化するのが嫌ならenum_forとinjectで書き換え。
む、 /(hoge)/ =~ "hoge..." だと2になるな。
835 :
デフォルトの名無しさん :2007/04/29(日) 14:29:25
>>833 puts "hoge moge foo bar hoge mage".scan(/hoge/).size
でいけました。
どもです。
>>834 部分文字列という概念がある
/(foo)(bar)(BAZ)?/ =~ "foobarbaz"
p $~.to_a # => ["foobar", "foo", "bar", nil]
はっきり言ってわけわかめ
素直にscanしたほうがいい
837 :
デフォルトの名無しさん :2007/04/29(日) 14:31:20
>>834 一応、解決はしたのですが、
>>834 はなんで、2になるんですかね?
()つけると、1回目のマッチで終わらないんですかね?
838 :
デフォルトの名無しさん :2007/04/29(日) 14:32:26
>>825 html = String.new じゃなくて html = '' で始めればいい。
>>820 の場合は foo = Array.new と初期化したあと、そのarrayは使われていないから、この初期化自体が無駄。
しかし
>>825 の場合は html = String.new したあとその string は使われているわけだから、無駄ではない。
840 :
デフォルトの名無しさん :2007/04/29(日) 14:51:19
>>820 は、無意味だよなあ。
Rubyは変数定義を極力しないという設計だからなあ。
ただ、他の言語で言う変数定義して明示したい場合は、
変数名でカバーするしかないだろう。
>>820 は「10文字くらいのメソッドチェーン」で配列が返ってくるんじゃねえの
foo = Array.new とかするような人は foo には絶対に配列入れるだろ
Array を new する場合はサイズを指定するかfillする詰め物を指定するかのどっちかが普通だから
new だけされてもなんだかなという気はする
foo = [] と書かれたほうがまだマシかもしれん
foo[0] = 何か などと(直後に)する場合には foo = [] とか foo = Array.new とかの意味はあると思う(Hashも同様) foo = 配列を返す何か とする場合は foo = Array.new は意味薄いかと 書き方論だけで言うなら # アレでナニな配列をfooに foo = 配列を返す何か とコメント付きでいきなり代入書いたほうが「わかりやすい」と思う Stringの場合はちょっと事情違うかも
変数名を複数形にするとかな。 羊や鯉のリストを返すんだって人は別の命名を考えてくれ。
>>842 そうだな。
プログラムとして意味があるかどうかというよりは、単にわかりやすさの話だとは思うんだが(w
俺がそういうのでnewするのはたまにRegexpでやるくらいかな。
少なくとも、事前にStringやArrayをnewするのは「ふつーではない」とは思う。
>>843 存在しなくても sheeps, carps を使うんだ!
漢字変換のプログラム書いてた時、いい変数名が思い浮かばず okuriganas = ... # 送り仮名の配列 みたいになって悲しくなったことを思い出した
847 :
デフォルトの名無しさん :2007/04/29(日) 18:13:24
与えられた配列の各要素をキー、その出現回数を値とするHashを求める 簡潔な方法があったら教えてください。 a = [3,5,3,1,5,5] h = Hash.new(0) a.each {|x| h[x] += 1 } というのを考えたのですが、これだとhを初期化しているのがなんかださい。 collectとか使って1行でスパッと求める方法はないでしょうか。
a.inject(Hash.new(0)) {|h, e| h[e] += 1; h } より簡潔なのは思いつかなかった。
inject万能だな…困ったときはinjectか?
require 'active_support' h = a.group_by{|k| k} h.each{|k,v| h[k]=v.size} もうちっと工夫の余地はないかのう……
group_byしたあとにmapすると、Hashじゃないけど、 連想リスト(associative list)にすることはできるな。 alist = a.group_by{|k|k}.map{|k,v| [k, v.size]} # .sort => [[5, 3], [1, 1], [3, 2]] # => [[1, 1], [3, 2], [5, 3]] 探すときは assoc, rassoc を使う。線形検索なので性能的な期待はナシで。
せんせー、最初のが一番わかりやすいでーっす
>>848 簡潔か?
後で読むときに悩むから
>>847 程度でいいよ。
hの初期化は変数宣言と同じようなもんだから問題なし。
とゆーか > 与えられた配列の各要素をキー、その出現回数を値とするHash これ自体がとってもわかりにくいと思われ 出現回数が必要になった時点でその場で数えるとか あるいは素直に{'data'=>arr, 'count'=> N}とか そういう構造にしたほうが見通しがいいと思う
>>849 というか元のinjectやらreduceやらfoldやらの
折り畳み関数の概念が秀逸なのかもしれん
面妖な構造のハッシュを見ると初心者っぽくて和む
>>855 元というなら、injectではなくinject:into:だ。
>>721 未だにUnicode特有の文字列を含むファイルの処理に困っている
>>686 です。
FindFirstFileW を 呼べばいい事はわかったんですが
呼び方がわからず躓いてしまっています
調べてわかった所まで書かせて頂きますと、
FindFirstFileWの第一引数は対象のパス
第二引数はデータを格納する構造体
メンバは
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[260];
WCHAR cAlternateFileName[14];
対応するpackテンプレート文字列はどうすれば特定できるのかわかりませんでした…。
-----
肝心のコード書ける所まで書いてみました
require 'Win32API'
obj = Win32API.new('kernel32.dll','FindFirstFileW',%w(p p),'i')
obj.call("X:\\*", ?)
わからない所は 構造体を Array.pack を使って置き換える部分と
そのデータの扱い方そのものです
誰か動かし方ご教授願えませんでしょうか…。
>>858 W系APIはUCS-2なのでUconvとか使わないと駄目。
クックブック見たけど面白かった レシピブックは「ふーん」だけどクックブックは「へー」って感じ ひさしぶりに読んで何か作りたくなる本
861 :
847 :2007/04/29(日) 23:41:42
みなさんありがとうございます。
>>848 injectはこんな使い方ができるんですね。
解読に20秒くらいかかりましたが、ちょっと感動しました。
group_by(というかActiveSupport)も知らなかったので参考になりました。
もともとやりたかったのは(情報が後出しになってすみません)、
アンケートデータのようなものを集計して、回答回数が多い順に
データと回答回数をCSV形式で出力することだったんですが、
思いついたのが以下のコードで、
a = [3,5,3,1,5,5]
h = Hash.new(0)
a.each {|x| h[x] += 1 }
h.keys.sort_by {|k| h[k]}.reverse.each {|x| puts "#{x}, #{h[x]}"}
2,3行目を一行にできれば、その後ろに4行目を続けて全部で一行になるのにと思ったのでした。
でもよく考えるとsort_byでh自身を参照してるので一度hを作らないとダメですね。
ていうか4行目もなんかダサい気がします。
ハッシュをソートしたりする場合はハッシュではなく
>>851 のように連想リストを使う方がよいのかもしれません。
ActiveSupport の blank? と Symbol#to_proc 大好き。
クックブックは面白そうなことがちょこちょこ書いてあるんだがちと高いな 立ち読みして記憶するにはボリュームあり過ぎだし困ったもんだ …わかったよお金の暇見て買うよ
ちなみにいくら?
procとかyieldとかあのへんはさっぱりわかんない もしかしたら役に立つかもしれないと思ってマニュアルは見るんだけど 何書いてあるかわかんないし
867 :
デフォルトの名無しさん :2007/04/30(月) 00:29:07
>>860 あれ読んで作りたくなるかなぁ。
たしかにJavaはフレームワークが複雑になってるけど
RubyはRails以外なにもないじゃん。
Webアプリケーション作るだけが仕事じゃないからねぇ。
実際今のlispブームと同じで一時的な集団逃避妄想にすぎない。
>>861 ハッシュじゃないとダメなの?
a = [3,5,3,1,5,5]
l = a.uniq.sort.reverse
l.each {|x| puts "#{x} #{(a.reject{|y|x!=y}).size}"}
とりあえず、Dir.glob, Dir.openあたりを UTF-8に対応させてみたけど、要る?
>>867 Railsの話を持ち出してるのは君だけだぞ
871 :
868 :2007/04/30(月) 00:42:33
あゴメン、すげー勘違いしてた
>>861 > でもよく考えるとsort_byでh自身を参照してるので一度hを作らないとダメですね。
h.sort_by {|k, v| v}.reverse_each {|k, v| puts "#{k}, #{k}"}
> ハッシュをソートしたりする場合はハッシュではなく
>
>>851 のように連想リストを使う方がよいのかもしれません。
実際にはsortやsort_byで連想リストに変換されるんだが。
>>858 codepage 65001 ってのがUTF-8らしいんだが、どうもシステム全体の設定を変
えないとUTF-8で返って来たりしないようだな。
hashにhogeっていうキーが無い場合に何かしたいです hash['hoge']は値''を取り得ますのでhash['hoge'].empty?は駄目です unless hash.has_key?('hoge') より if hash['hoge'].nil? のほうがわかりやすいですよね
unlessでも別に分かりにくくはないので「よね」と言われても困るが、 それこそActiveSupportのblank?の定義を貰ってくれば?
hash['hoge'] が絶対に nil にならないなら後者でもいいかと str = nil のまま hash['hoge'] = str されるとか そーゆー罠みたいな細かいことを考えなくていいのが前者 ? つきのメソッドと unless の組み合わせは慣れないと読み下しにくいけどな
878 :
858 :2007/04/30(月) 02:51:05
レスくれた方ありがとうございます
>>859 どこかに動かしてるサンプルないでしょうか?
どの段階でuconvの機能を使えば良いかわかりません…。
>>869 とても、とても、とても欲しいです。
>>873 そういう事しないと返ってこないですか…。
>>868 アルゴリズムとしてとても遅い。真似すべきではない。
そんなんで優越感得られるなんて君の世の中はずいぶん狭いな
そーゆーこと言うとどっかのスレみたく「学校ではプログラマですが何か?」とか そういうレスが返って来るからやめといたほうが…
>>868 これはシンプル!
>>879 さんのいうように、実行速度を確認してから
採用を判断したいと思います。
>>872 Hashでsortが使える、というかEnumerableで使えるすべての関数を
使えることに今気付きました。(^^;
あと連想リスト、というか二次元配列のeachってブロックのパラメータを複数指定して、
a = [[1,2,3],[4,5,6],[7,8,9]]
a.each{|x,y,z| p "#{x},#{y},#{z}"}
みたいなことができるんですね。びっくりです。勉強になりました。
>>870 本読んでないでしょ。「Java to Ruby」の話を持ち出されたので、その内容に書いてあるrailsの話をだしたまで
885 :
811 :2007/04/30(月) 12:54:40
遅レスすいません。 変数宣言の件、どうもでした。 スペルミスしまくってしまう人間なので ちょっとしたもの作るときのことも考えると、 自分は Ruby 使うことができなさそうっす。 Perl から PHP, Python, Ruby のどれに流れようかと 迷ってましたが、また Perl に戻るしかないのか…orz 御目汚し失礼しました。
「Perlを使っているから自分で作った変数すらスペルミスをしっ放し」なんだということに 早めに気づいたほうがいいと思う
887 :
811 :2007/04/30(月) 13:39:56
>>886 スクリプトを書いているときに
スペルミスをしないように意識することはそんなに重要なんでしょうか?
ミスしないほうがいいに決まってるんですが、
そこに気を張っていると疲れてきてしまうような気がして…。
「ミスしたら教えてくれる」と「ミスしても教えてくれない」って
大きい気がしています。みんなあんまりスペルミスしないのかなぁ。
ってこれスレ違いでしょうか?
もし、こういう話題でいいスレあったら誘導して頂けたら
ありがたいです。
eclipse
Emacs使いならdabbrevとか
vi使いなら m9(^Д^)
マンセーでなーーんも考えてない奴らはともかく、matzはミススペルはしないんだろうな。 でなきゃ、こんな仕様に好んでするわきゃない。
ミススペルを自動で直してくれる言語処理系は存在しない。 それはデバグ機能とかエディタとかIDEのお仕事。
なんか意味不明なネタで盛り上がっているようだが クラスって使うもんで作るもんじゃないだろ。 常識的に考えて・・・
その変数やメソッドが「未使用」や“未定義”であるかどうかを調べるのは Rubyパーサ本体の仕事ではないと考えたんだろうね わからんでもないが つか別に現状でもできなくはないだろ
えっおいらは foobar.rb --- class Foobar ... end if $0 == __FILE__ then Foobar.new.exec end --- とかよくやるけどなあ。
そもそもの問題として、Rubyのinitializeにそんな特殊な権限はねーよ
つか、matzがインスタンスにインスタンス変数が追加される時のフックのためのAPIを用意しててくれれば 済むはなし。こういうのが必要にされるという想像力が、絶望的に欠けてるんだよなあ。あのヒトには…。
なら、要求すれば?
論理的に必要性が説得できればつけてくれるよ。
というか、要求が通るとおらない以前にここでぼやいてるだけじゃねーか。 matzに見えるところでやれよう。
902 :
デフォルトの名無しさん :2007/04/30(月) 17:14:38
Meadowでirbshを動かせてる人いますか? M-x irbshとすると irb(main):001:0> というプロンプトがでて、行頭にスペースを入れると、 irb(*SHELL*):001:0> となるので、irbshの起動はできているのですが、 プロンプトに式を入力してEnterキーを押しても、式が評価されず、 改行が挿入されてしまうだけの動作になってしまいます。 途中で無茶な入力をすると、 NameError: undefined local variable or method `' for main:Object とでて、プロンプトが復帰しますが、動作は変わりません。 --- 環境: Meadow 3 ruby 1.8.6(One-Click Ruby Installer) irbsh 1.0 irb 0.9.5
>>901 matzはここ見てるから
ここで話題になったらもう駄目
>891 長いことプログラミングやってると間違えなくなってくるからなぁ。 それでも、稀にハマることはあるが。 あんまり広い範囲に影響するような変数を極力作らない。 1画面に収まるような場所同士の変数名は間違えたとき判りやすい。 どーにも心配なら、 class << vars = nil attr_accessor :a, :b, :c end とかやって、全ての変数を vars.変数名= の形で扱うとかどうよ。 そうすれば、アクセサの定義されてない vars.d= は例外になる。
906 :
904 :2007/04/30(月) 19:18:34
ああ、この場合はインスタンス変数の話だからこうか class MyClass def initialize @vars = nil class << @vars attr_accessor :a, :b, :c, :d end end def test @vars.a = 1 @vars.b = 1 @vars.c = 1 @vars.d = 1 @vars.e = 1 end end obj = MyClass.new obj.test test09.rb:13:in `test': undefined method `e=' for nil:NilClass (NoMethodError) from test09.rb:17
907 :
デフォルトの名無しさん :2007/04/30(月) 20:09:28
nilに特異メソッド定義するなよ
Matzを追い出すなんてw
910 :
811 :2007/04/30(月) 21:03:14
色々ご教授頂きありがとうございます。
>>888 RDT とかですか?
そうですね。書くときのミスを減らすって意味では
いいかもしれませんよね。
Perl の use 'local' みたいなものがあったら
もっと嬉しいですけど。
>>891 後半の部分、これが全てのような気がします。
私みたいなオマヌケには使えないのかもしれません。
イテレータとかミキシンとか楽しそうなんですが…残念。
>>906 これなら簡単にできそう、と思いました。
でも、いきなりこれ書いたら多くの Ruby 使いさんは
???ってなってしまうんでしょうね。
Ruby も Rails も面白そうで本を読みつつ頑張ってますが、
私が入れそうな世界じゃないのかも…面白そうなのに(つдT
,. --―…、 / /:. \ ./ /::::::::::. ヽ ‘ー--一'´ \:::::::. ', ヽ:::::. ! /⌒丶 ,. .-.''.´ . .',:::: |` 丶、 / !:::::..\/ . . . . . \.L__ l. . . \ | |――/. /、 . . . . . . .ヽ . ヽ . . . .ヽ | j /. ./ \.ヽ . . . . .'., . . . . . . .', | / |. . l \_. . . . ',. . . . . . ..| | / |:.._l ´\ . . . . !. . . . . . .| l / .|´.l _ ,r7jヽ,. .:.r ‐、 . . ...| |_,ノ |. .!イト、 弋:ソ!. ..| 〉 . .:.| |.小 ヾ' , , , |:!. |! イ. . . ..| |. |..ハ''' |リ!.|l . !. . . . | |. | |. ヽ、,-_ _ -' ''|.!ヽ.|:.. . . .| |. | |! . . ._ -' |l ヽ:.:. . .| |._| > '' |! ', . ...| __r‐'7 ̄!. !:. .:.| ,r=―フ/ | | _ ,, -- !:. .:.| /__/ | l l _. - ' /l. . .| _r''厂\ ! ! l '' / !i . ! // \ | !:人 / i i:リ ./| ヽ_ ヽ!个‐' / i i | .! \ __/l / / ∨\ / /_l / / . | \rへ _/ヽー ' ∨ /
>>906 class << @vars
attr_accessor :a, :b, :c, :d
end
配列オブジェクトに後から要素(フィ-ルド)を追加できるのね。
class << @vars の "<<" の記号って ruby だと良く使われる
ものなの?それともあまり一般的ではないのかな?結構素敵だとおもた。
914 :
811 :2007/04/30(月) 21:32:26
>>906 配列オブジェクト…?ってどこからそう思われたんでしょうか?
@ ってインスタンス変数のプレフィックスだと思ってたんですが…。
915 :
811 :2007/04/30(月) 21:33:56
>>887 その考えはただしいけど、Rubyでは直接サポートされてないからしかたない。
できるのはせいぜい @x ではなくて self.x をつかうぐらい。これならスペルミスしたときに実行時エラーになる。
あと、rubyを-wつきで実行すると、値を設定されていないインスタンス変数を参照したときに警告が出る。
> rubyを-wつきで実行すると、値を設定されていないインスタンス変数を参照したときに警告が出る。 これで十分。
変数を宣言するようにしてれば
>>918 -wをつけても、タイプミスしたインスタンス変数への代入は警告が出ないから、十分ではない。ないよりはましという程度。
921 :
811 :2007/05/01(火) 13:36:21
>>917 >>920 そうなんです。代入でタイポしたら終わりなのであんまり意味ないんです。
私は今朝も遊びでちょろちょろ書いてたらスペルミスして
怒られてしまうようなヘタレだったので、
>
>>888 さんが言われるように eclipse がいいのかもしれませんね。
あれはあれで . 打ってすぐに補完、
というわけに行かないので面倒ですけど。
922 :
デフォルトの名無しさん :2007/05/01(火) 13:42:24
インターフェイスとか抽象メソッドみたいな仕組みはどうやって実現する?
製作中にエラーを一度でも起こしたら誰かに殺されるとかいう用途にはRubyは向かない Rubyを「その言語」のように矯正しようとせずに素直に他の言語使うんだな
かつての型なし言語逝ってよしスレみたいな流れだな・・・
>>884 「Ruby クックブック」と「Java から Ruby へ」を混同してない?
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、 >> 4の倍数で無ければ、"n is not ROUND(4)" を出力するプログラム 条件:一切の条件分岐文を使ってはならない
>>922 メソッドfooを持っていれば基底クラスやインターフェース関係なく
どんなオブジェクトもfooを持つものとして統一的に扱えるから
そんなものは不要ってことになってるらしい。
生成した SQL が (意味的に) 等価かどうかテストするのに良い方法って無いすかね? actual = "SELECT * FROM foo WHERE baz = 'qux' AND bar = 42;" expected = "SELECT * FROM foo WHERE bar = 42 AND baz = 'qux';" assert_same_sql(expected, target) # => pass みたいな。
if n % 4 == 0 then puts "#{n} is ROUND(4)" else puts "#{n} is NOT ROUND(4)" end 条件分岐文使ってないよ
def r4(n)
print "n is #{["not ", ""][((n
>>2 )&1)]}Round(4)"
end
>>930 Rubyのifは文ではなく式だからね…
設問的には「ifやunlessや三項式を使ってはならない」と正確に書くべきだな
「一切」というと、print内部で条件分岐が含まれてたりするのは 問題になるのかね?
Rubyで記述されてなけりゃOKなんじゃね
無理してレスしなくていいんだよ?
じゃあ無視すれば?
>>927 プラグインみたいなのを作るときに、「このメソッド実装してね」ってのはどうやるの?
def r4(n) ? c言語?
>>937 ドキュメントに明記
実装し忘れたらそのメソッドを呼び出した時点でエラー
やりたきゃプラグイン登録時にmethodsでも調べてチェック
いじょ
>>937 raise NotImplementedError
>>926 s=['','not','not','not']
6.times{|n| puts "#{n} is #{s[n%4]} ROUND(4)"}
RAAにあるnet-hatenaを使いたいのですが、インストール方法がわかりません。 当方の環境はMacOSXですが、Win向けでもかまいません。 ご教授お願いします。
ほほう
944 :
デフォルトの名無しさん :2007/05/02(水) 02:32:30
def printer(str) puts str end def caller(path, func) Dir::foreach{|file| func(file) } end caller("/", printer) 関数ポインタをつかおうと書いたのですがえらーになちゃいます
>>944 そういうときはブロックで包んでやる(Dir.foreachにパラメータが必要なので補っておいた)
def printer(str)
puts str
end
def caller(path, &func)
Dir::foreach('.'){|file|
func.call(file)
}
end
caller("/") do |str|
printer(str)
end
あと、callerというのは定義済みの関数なので、再定義しない方がいいと思う。
「いわゆる関数ポインタ」とか「関数ポインタのようなもの」と表現しないと Rubyには関数ポインタなんて存在しませんが何か、とかつまんない突っ込み受けそうだ
947 :
945 :2007/05/02(水) 04:01:18
突っ込もうかと一瞬だけ思ったけど、言っても詮無いことだと思って言わなかった。 書いたの見てたらブロックで括るのもなんか違うような気がしてきた。
「引数」でメソッド渡す場合の一番素直な方法はブロックだと聞いた 関数のポインタを渡す、というイメージとコードの字面のギャップは確かに大きいけど、動作的には真っ当かと…
>>946 Ruby信者は初心者スレでもそんな感じだからな。いい読みだ。
でも現れませんでしたねw
毎度
>>946 相当の書き込み(それはつまんないんだぞ、という事前の水差し)があれば
信者も興奮しなくて済むんだけどな。
>>942 インストーラ入れ忘れてました^^;
RAAのほう、更新しておきました。
インストール方法は
$ setup.rb config
$ setup.rb setup
# setup.rb install
または
# setup.rb
>>946 を読んでも意味が分からなかったんでしょう。
関数ポインタでやることに一番近いのはprocですかねい。
>>944 こーゆーのDO?
def printer(str)
puts str
end
def mycaller(path, visiter)
Dir::foreach(path) {|file|
visiter.call(file)
}
end
pfunc = proc{|str| printer(str)}
mycaller( path, pfunc )
957 :
デフォルトの名無しさん :2007/05/02(水) 09:22:13
def printer(str) puts str end def mycaller(path) Dir::foreach(path) do |file| yield(file) end end mycaller(path, &self.method(:printer)) とか。
959 :
デフォルトの名無しさん :2007/05/02(水) 10:32:46
javaでxlsファイルをよみこんでcsvファイルに変換したいのですが・・ 2日間悩んでますが、まだ解決しません
スレ違いでは
ところがrubyでやったら5分で解決しました、とかいう話?
なんてったってJavaの10倍の生産性だからな! 正確には「RoRでやれることをJavaで作ろうとすると10倍手間がかかる」だと思うんだが まあ所詮アオリ言葉だしそのへんは鵜呑みにする人がプギャーだということで放置 Javaコードを吐き出すRubyスクリプトとか誰か作ってないかな
実際にコスト比較したケースってあるのかな?
はい、次の初心者さんドゾー↓
他のファイルにあるクラスを利用する時はどうすればいいのでしょうか? (C/C++のincludeみたいな事です)
require とか include すればいいんじゃね? 後に続くファイル名にはある程度規則があるので気をつけること
>>966 requireで出来ました!ありがとうござます
>>962 最近試してみて判ったことなんだけど
Java (GWT) >>>> RoR だと思う
969 :
928 :2007/05/02(水) 12:08:31
別に SQL に限らなくても良いんですが、 この手のコードジェネレーション的なモジュールのテストって みんなどうやってるんでしょ? やらない?
RoRのスゴいっぷりはひとえに「どれくらいのものをどれだけの手間で作るか」にかかってると思う 「ある程度以上」を突き抜けるメリットがなんもないからね 通常限界を超えて実装しても、それはおそらく他言語フレームワークよりもいびつで不安定で遅い
>>952 作者様ありがとうございます。
今晩、試してみます。
>>968 GWT かなり気になってたんですが、
どの辺が RoR よりよかったですか?
973 :
942 :2007/05/03(木) 00:26:40
>>952 インストールは無事に済んでいるはずなのですが、
keywordlink.rbのset_keyword_linkメソッドを使おうとしてもライブラリが利用できません。
require 'net/hatena' でもだめ。
requireをなくして Net::Hatena::Diary.set_keyword_link(hoge)でもだめでした。
大変お手数ですが、簡単なサンプルをいただけないでしょうか?
Windows で Gyre 使ってみたかったのですが
下記のようなエラーが出てしまいます。
もしかして Windows 環境では Gyre 使えないのでしょうか?
C:\>gem install -y ruby-debug coderay
Bulk updating Gem source index for:
http://gems.rubyforge.org Building native extensions. This could take a while...
ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError)
ERROR: Failed to build gem native extension.
ruby extconf.rb install -y ruby-debug coderay
can't find header files for ruby.
Gem files will remain installed in C:/usr/local/ruby/lib/ruby/gems/1.8/gems/ruby-debug-base-0.9.3 for inspection.
Results logged to C:/usr/local/ruby/lib/ruby/gems/1.8/gems/ruby-debug-base-0.9.3/ext/gem_make.out
>>974 >ERROR: Failed to build gem native extension.
これの意味が分からないなら諦めてくれ。
分かるならとりあえずやってみることを思いつくはずだが。
puts "OK!" if(なんたら) こういうの何っていうの? 『後置条件判定文』とか俺用語で理解するのは いい加減どうかと思うんだ漏れ orz
if修飾子 or 後置if
>>977 後置if修飾子 って言わないと普通のif文とごっちゃにならない?
細かいことだけど。というかrubyだとifって文じゃなくて式なの?
プログラムは
C言語しかやったことないからよくわからないです orz
ため口で質問してるみたいになってしまってすみません なんか日本語が不自由だ orz
>>978 Rubyのifやcaseは式ですよ。代入も出来ます。
signum =
if x < y
-1
elsif x > y
1
else
0
end
# 例が悪いか。
class ... endも式です。返すのはnilですが。
>>980 なんかシンプルで面白いです。少しあとはじぶんで調べてみようと思います。
ありがとうございました! thx
if hoge end は式じゃなくて文だよ。
式だから、三項演算子で status = n % 2 == 0 ? 'even' : 'odd' と書くかわりに status = if n % 2 == 0 then; 'even'; else; 'odd'; end と書いても動作するんだよな
Win32APIのラッパー書きまくってまとめてあるようなサイトというかライブラリないですか?
>>983 文だけど値を持つってだけで、文は文だよ
式って覚えてた。そっちの方が覚えやすかったから
リファレンスマニュアルに >if 式は、条件が成立した節(あるいは else 節)の最後に評価し た式の結果を返しま >す。else 節がなくいずれの条件も成り立たなけれ ば nil を返します。 とかあるんだから式でいいんじゃね?
>とかあるいう記号があるから とかあるから、を とかいう記号があるから、に直そうとしてミスったのでありますorz
990 :
942 :2007/05/03(木) 11:18:56
〉〉952 すいません。自己解決しました。
>>980 > class ... endも式です。返すのはnilですが。
p class X; self end
を試してみ。
最後に評価した結果が返るのか。
バージョンによると思われ。 確か昔のRubyはnil返してた気がするけど?
>>993 そういわれると、随分前にそんな変更があったような気もするな。
全てが式っつーと、なんだか関数型言語っぽいな。
class〜endは定義したクラス、 def〜endはUnboundMethodあたりを返すと納得できそうなんだが、 ま、使わないかな。
>>998 > class〜endは定義したクラス、
>>991 > def〜endはUnboundMethodあたりを返すと納得できそうなんだが、
> ま、使わないかな。
ほとんどの場合使われないのに、無駄にオブジェクトを作るのもなんだかとい
う気がする。
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。