- 1 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 00:26:33 ]
- プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.6 の使用を強くお勧めします】 関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
- 411 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:10:40 ]
- GDが使いたいならRuby/GD
- 412 名前:デフォルトの名無しさん [2008/05/05(月) 22:40:56 ]
- >>408
プライベートで良いんですね。 ありがとうございます。 >>409 なるほど。 selfで呼べば良い訳ですね。 インスタンスメソッドは関数の型宣言みたいなもので、 クラスメソッドは関数みたいな物ですね。 ありがとうございます。
- 413 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:02:25 ]
- あ。違いますね。
インスタンスメソッドは実行時に一つ起動しているオブジェクトで、 スコープの範囲で何時でもどこからでも呼べる。 クラスメソッドは宣言してからようやく使えるメソッドですね。 オブジェクトの起動タイミングが違うという理解でしょうか。
- 414 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:33:54 ]
- >>413
かなり致命的に理解を間違っているようなので このスレで聞くよりも、身近なプログラマに直接質問してみることを薦める もしくはGoogleで、オブジェクト指向について基礎から解説してるページを探すとか
- 415 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:43:24 ]
- >>413
1.私は万年筆が好きだ 2.私はこの万年筆が好きだ この二つのうち、1は万年筆というもの、2は具体的な品を指してるだろ オブジェクト指向では1がクラス 2がインスタンス ここで.色関数を考えると、 (2の意味の万年筆).色 ってのは、具体的な品だからちゃんと色が決まってる これがインスタンスメソッド (1の意味の万年筆).色 だと、色が決まらないから、クラスに対してインスタンスメソッドは 呼び出せない 同様に、そのものの種類を返す関数 .kind があったとする このときは、(1の意味の万年筆).kind で、"万年筆"って文字が返ってくるし (2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる これがクラスメソッド
- 416 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 01:09:00 ]
- >>415
> (2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる > これがクラスメソッド これは違うんじゃ...
- 417 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 01:11:19 ]
- 比喩でクラスとメソッドの関係を説明しようとするのがそもそも間違いだな
- 418 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 12:06:22 ]
- つまり、既に初期化されている(スクリプトを読んだ時点で)のがクラスメソッドで、
インスタンスメソッドはnewなどして、その時点にならないと 初期化されないメソッドという事じゃないんですか?
- 419 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 12:35:38 ]
- Rubyではクラスもオブジェクト。
Rubyではオブジェクト毎にメソッドを定義できる。 クラスオブジェクト(Classクラスのインスタンス)にメソッドを定義したのがクラスメソッド。 そのクラスのインスタンスとは直接は関係しないから、クラスメソッドを定義しても、インスタンスメソッドには影響しない。
- 420 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 12:47:26 ]
- irb> class C ;def C.clsmtd; p self.object_id; end ;end
irb> C.clsmtd 537963320 irb> p C.object_id 537963320 irb> p C.new.object_id 537887540
- 421 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:09:22 ]
- >>418
どうもインスタンスメソッドに関して、誤解があるように思えるな foo_instance = Foo.new # オブジェクトの生成 foo_instance.a(1, 2) # foo_instanceのメソッドaを実行し、結果を返す a(1, 2) # エラー このスクリプトでなぜエラーが出るのかは理解できる?
- 422 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:41:55 ]
- では、クラスは何処にあるんですかね?
インスタンス化されたクラスは? 場所の定義は無いんですか?
- 423 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 15:13:18 ]
- Rubyがどうかは知らんが、よく用いられるモデルで説明してみる
class A @a @b @c end instance = A.new は、C言語でいえば、void *instance = malloc(3); この3はAに変数が三つあることに対応してて、このケースならinstance[0] が @a ,instance[2] は@cに対応してる 例えばここにインスタンスメソッドとして def set_a(new_a) @a = new_a end があったとする。 instance.set_a("test")のように呼び出すと、内部ではset_a(instance,"test")と変換される 実際に呼ばれる関数は、C言語で書けば void set_a(instance , new_a) { instance[0] = new_a; } こんな風に、@aなりを使ってると、listのアドレスを確定させなきゃならんから 具体的なインスタンスに対してしか使えない クラスメソッドは、Cでいうところのグローバル変数のみを使ってる関数で イメージ的には int num = 10; int class_num() { return num; } に対応する。 この場合は変数instanceをメソッド内で使ってないので、A.class_method でもいいし instance.class_method でもおk
- 424 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 15:16:52 ]
- 訂正
>line23 listのアドレスを→instanceのアドレスを >line29 int class_num() ⇒ int class_method()
- 425 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:26:27 ]
- >>422
定義されたクラスは、定数として存在している class Foo (ここにメソッドとかの定義) end print Foo.name # "Foo"が出力される print Foo.class.name # "Class"が出力される
- 426 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:46:53 ]
- Rubyではクラスもインスタンスもオブジェクトで、実体はオブジェクトスペースに存在してるよ。
それらに名前をつけたのが変数や定数。 変数や定数は実体がオブジェクトスペース内のどこにあるのかの情報を持ってる。
- 427 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:45:36 ]
- 『プログラミングRuby』にもそんな感じの章があるよ
構造体、メモリ、ポインタで説明してほしい人は 読んでみると何かしら得るものがあると思うんだ ttp://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html ここの図が良いんだけどFigure not availableになってるのが残念
- 428 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:05:52 ]
- rubyでオブジェクト指向理解しようなんて無理でしょ
遠回りだけどjavaをしっかり勉強した方がいいじゃないの?
- 429 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:10:44 ]
- Javaのオブジェクト指向はオブジェクト指向なJavaでしかないと思うんだ
- 430 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:32:46 ]
- オブジェクト指向を理解するという文脈でJavaを第一に持ってくる
ってことは理解してないってことだよな。
- 431 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:09:23 ]
- ていうか
Rubyのクラスとインスタンスとメソッドを理解したいのか オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか どっちかにして欲しい 後者ならスレ違いだ
- 432 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:55:34 ]
- >>430
オブジェクト指向を学ぶ上でJavaより勉強する価値のある言語って何? 批判するだけで自分の考えは何も無いの?
- 433 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:57:09 ]
- Smalltalkあたりじゃないかな。
- 434 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:57:26 ]
- smalltalkじゃね?
- 435 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:57:55 ]
- 有名なのはSmalltalkかな
- 436 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:59:01 ]
- Smalltalkだろ。
- 437 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:59:26 ]
- Smalltalkだな
- 438 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:00:25 ]
- smalltalkがjavaより勝ってるものって何?
- 439 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:05:34 ]
- 純粋さ
- 440 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:06:56 ]
- おっと無能の数はjavaには敵いませんな
- 441 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:06:57 ]
- 2chは知ったかばかり
- 442 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:11:16 ]
- オブジェクト指向の学習用として考えるなら、だいたいどれも大差ない
C++でもRubyでもPythonでもJavaでも (smalltalkは使ったことないから知らないが)
- 443 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:11:46 ]
- >>438
というかJavaは、意図的に完全なオブジェクト指向にしてない 実用面ではどうかってなるとまた別の話になるんだが、 少なくともオブジェクト指向って観点から見ると美しくない 逆にSmalltalkは文字通り全部がオブジェクト 制御構造すらオブジェクトのメッセージ扱いになる RubyもSmalltalkからメタクラスとかの概念をもらってるはず
- 444 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:12:09 ]
- smalltalkがjavaより勝ってるものって何ですか〜?
- 445 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:15:03 ]
- じゃあどうしてデザインパターンの書籍の多く(専門書も含めて)はJavaを元に書かれてるんだ?
- 446 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:16:28 ]
- JavaはOO貫徹をあきらめてAlgol系並の実用性を手に入れたようなもんだからな。
- 447 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:17:39 ]
- >>445
最初のGoFはSmalltalkだったぞ。 のちにJava優勢になったのは普及度の違い。
- 448 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:18:33 ]
- >>445
オブジェクト指向をよりよく体現してる=言語として人気がある とはならないだろ どっちにしろJavaで上手い設計してる奴はSmalltalkから来てるよ
- 449 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:20:16 ]
- Javaスレッドで前にも見たような流れだな
少なくとも実用的な言語を元に学ぶのが良し、という考え方の元ではJavaだろう Smalltalkでオブジェクト指向を学べってのは大げさ過ぎる
- 450 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:20:46 ]
- >>445
実用を兼ねてるんだろう Java使ってる人は多いだろうし、JavaはC++やC#とかとも文法が似てる ・・・・・と言いつつ、GoFのデザパタ本はSmalltalkも使ってたような
- 451 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:21:40 ]
- smalltalkってそんなに完成された言語だったの??
- 452 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:22:22 ]
- つかなんでいきなりデザインパターンみたいな応用が出てくるんだ
もともとの問題を摩り替えないほうがよい
- 453 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:25:46 ]
- Javaで学べっていっても初心者的には構文覚えて精一杯じゃないか
自分でいい設計してるソース探してきて読むとこまで勉強するよりは Smalltalkのライブラリでも読んでりゃいいとは思う
- 454 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:26:16 ]
- GoF本は最初のバージョンはSmalltalkとC++でサンプルが書かれてる。
もともとSmalltalkで得られた知見だしな。 新しい版はJavaコードも使ってる。
- 455 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:27:35 ]
- >もともとの問題を摩り替えないほうがよい
Smalltalkに噛み付く奴はスレ逸らしだろうな
- 456 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:27:46 ]
- OOを覚えるためにはやはりEiffelしかないだろ
- 457 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 02:00:12 ]
- Eiffelもやっとくべきだと思いつつまだ入門もしてないだよなー。
- 458 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 06:09:55 ]
- なんというか>>400読んで、
ちょっと前に本スレにいた京大君を思い出すんだよな(本人だと言うわけではなく)。 んで、実際のところ質問者はCとかでは、コードをすらすら書けるんだが、 「オブジェクト指向」(または、Rubyのモデル)の概念でつまづいてコードが書けないのか。 それとも計算機の理論を一通り座学して、これからコードを書くに当たって、 (Cではなく)楽ちんそうなオブジェクト指向スクリプト言語を選んだのか。 前者と後者で、かなりすべき対応が変わると思うんだが。
- 459 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 07:26:35 ]
- Javaは非オブジェクトな型をあえて残した言語だからな
OOPLとしては、普及してるが純粋でない。
- 460 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 10:24:48 ]
- Smalltalk が Java や Ruby より圧倒的に勝っているところをひとつ挙げるとすれば
リフレクションとかに代表されるイントロスペクション機能でしょうね。 分かりやすいところでは、IDE やデバッガなどの機能充実度や、それらの 作りこみやすさに出てくる特徴です。もとは LISP 譲りの機能ですが、Smalltalk での 充実度は LISP をも凌駕しています。これは Smalltalk 処理系が Smalltalk 自身で 記述されている(記述可能…とかではなく、実際にそれで運用されている)ことに 由来します。 Ruby 実装では Rubinius や今度の RailsConf でデモされる予定の MagLev が、 現在の制約を克服して Smalltalk に近づこうと努めているみたいです。 これらは Smalltalk と同じく、Ruby 処理系をできるだけ Ruby で記述しようとする ものたちです。 あと余談ですが Java は、Ruby や Smalltalk などの「メッセージングのOO」という パラダイムに則していないだけで、C++ や Eiffel などの「ユーザー定義型のOO」と いうパラダイム的にはかなり純粋なほうですよ。念のため、後者は“ユーザー定義型”を クラスで実現しようとする考え方で、メッセージのやりとりとかとは無関係です。 裏を返せば、Ruby や Smalltalk は、Java の土俵である「ユーザー定義型のOO」的な 切り口で見たときに、足りないところが多々あるということになり、実際にそうなっています。
- 461 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 10:54:06 ]
- Smalltalk まで読んだ
>>458 ぶちゃけた話、オブジェクト指向を完全理解しなくてもRubyのクラスやメソッドは使えるよな 継承や委譲もなんとかなると思う
- 462 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 12:36:37 ]
- >>458
オブジェクト指向が分からないのか、 Rubyでのオブジェクト指向を実現する技法が分からないのかでも話が変わってくるのでは オブジェクト指向って思考法そのものは言語に依存しないと言われているし
- 463 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:02:54 ]
- 関数は (関数 引数 引数) 見たいな記述でもキモいって言われないのに
オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?
- 464 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:16:56 ]
- どのくらい言われてるかはわからないけど、あるとしたら、多重定義の関係じゃない?
「呼び出し先の決定権を持っている奴」が、端っこではない場所に居て、やや目立ちにくい ・・・という、ビジュアル的な違和感ではないかと思う。 結局のところ、慣れればそれまでって気がするけどね。
- 465 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:18:40 ]
- 第1引数を太字でシンタックスハイライトすれば解決
いやわりとマジ
- 466 名前:デフォルトの名無しさん [2008/05/07(水) 15:18:42 ]
- すごく初歩的な質問なんですが、
puts "あなたの名前は?" name = gets.chomp puts "あなたの名前は#{name}です" これを実行しても dan(←入力数値) あなたの名前は? あなたの名前はdanです となって文字列の出力するタイミングが意図したものにならないんです^^; どうすればいいのでしょうか? ちなみに開発環境はRDEを使っています。
- 467 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:27:17 ]
- $stdout.sync = true
puts "あなたの名前は?" name = gets.chomp puts "あなたの名前は#{name}です"
- 468 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:44:27 ]
- smalltalkerって名前の割によく喋るね
- 469 名前:デフォルトの名無しさん [2008/05/07(水) 15:47:15 ]
- >>467さんありがとう!できました^^
- 470 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:38:45 ]
- >>464
関数に見えるというのが。フラットな名前空間にとっちらかる感じで。 名前空間を導入すると今度は対象がわかってるのに名前空間を書かないといけないのがあれで。 ……まあ結局は気分なんだが。CLOS がやっていけてるんだからやっていけるんだろう。
- 471 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:55:06 ]
- >>463
> オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして? C言語でオブジェクト指向で書くとそんな感じだから、別にキモいとは思わない。
- 472 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:56:37 ]
- >>463
メソッドチェーンができないから
- 473 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:51:46 ]
- smalltalkとオブジェクト指向の話面白そうだなぁ
誰かスレッド作ってくれんかなぁ
- 474 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 09:36:58 ]
- cgi で画像を並べたいんだけどどんなふうに書けばいいの?
つまりはこういうソース吐きたいんだけど <div>1 2 3 4 5</div> <div>6 7 8 9 10</div> or 1 2 3 4 5<br> 6 7 8 9 10<br> or <div>1 6</div> <div>2 7</div> <div>3 8</div> <div>4 9</div> <div>5 10</div> あとオプション1つでテーブルタグも吐けたりするとうれしいな
- 475 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 11:06:53 ]
- まあとりあえずは自力で配列内容を表示させる勉強しろ
手を抜くより先に覚えることはたくさんある 「自分で作れるけどもうめんどいから他のことに時間かけるために手を抜く」 というのが正しいプログラミング メソッドを作ることはできるかな できないのなら作り方おぼえるといい
- 476 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 11:22:11 ]
- 引っかかる点は何だろう
「カウント○ごとに何かをする」という専用の処理が何かあると思うことかな ありそうだけど無いよね each_with_index で回して index + 1 の 剰余5 が 0 のとき何かする、という記述しかない?
- 477 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:13:18 ]
- each_sliceともちょっと違う?
- 478 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:07:17 ]
- def group_by
hash = {} each do |item| key = yield(item) (hash[key] ||= []) << item end hash.collect {|key, arr| arr } end こんなメソッドって標準になかったっけ?
- 479 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:01:55 ]
- Enumerable#group_byは1.9と1.8.7だけかな?
もっとも、Hashのままで返すけど。 というか>>478のだと、どのグループかわからなくなるんじゃないか?
- 480 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:03:15 ]
- > hash.collect {|key, arr| arr }
hash.values
- 481 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:16:18 ]
- >>479,480
さんくす そうだよな、Hash#values があるじゃん なんて間抜けなんだ
- 482 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 14:38:43 ]
- rubyを最近習い始めたのですが、
1からキーボードで入力した数までの和をもとめる プログラムの作り方がいまいちわからないのですが 教えていただけませんでしょうか?
- 483 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 14:40:53 ]
- すいません、スレ違いでした。
スルーしてください
- 484 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 14:54:50 ]
- >>482
def sum(n);n*(n+1)/2;end
- 485 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:58:44 ]
- >>484 が良い解だと思うけど、Ruby的には
def sum(n); (1..n).inject{|a,b|a+b}; end という風にできることを知っていると後で役に立つかも。 立たないかも。
- 486 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:37:59 ]
- 似たような演算を多数作るなら、以下のように。
ただし>485の5倍程度の時間がかかる。(毎回evalのため) def fn_maker(fn,lst);lst.inject{|r,i|eval("r"+fn+"i")};end def summerise(x);fn_maker("+",x);end def multiple(x);fn_maker("*",x);end def divide(x);fn_maker("/",x);end def subtract(x);fn_maker("-",x);end def sum_1_to_n(n);summerise(1..n);end p sum_1_to_n(10) a=[3.0,5,2] p summerise(a) p multiple(a) p divide(a) p subtract(a)
- 487 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:54:07 ]
- send使えよ
- 488 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:15:48 ]
- つか初心者スレっぽいな
- 489 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:43:59 ]
- >>482に対して>>484-486を持ち込むあたりいかにも初心者だな
微笑ましい…のか?
- 490 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:50:19 ]
- 入力をどう扱うかも示さないと回答として片手落ちだしな
- 491 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:05:25 ]
- というか初心者スレとしては普通に回答するか解説つきで説明すべきなんだがね
自分の知識の結果をただ披露して悦に入ってどうするよ
- 492 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:07:48 ]
- YARVで、あるベンチマークが
* 「100%速くなった」というのは、時間が半分になったということ? * 「200%速くなった」というのは、時間が1/3になったということ? * 「25%速くなった」というのは、時間が20%減ったということ? ( 1 / (1-0.20) = 1.25 ) 教えてえらいひと。
- 493 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:17:30 ]
- 自己嫌悪はそこまでにして、次w
- 494 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:23:19 ]
- >>482
数値から数値までを足すときはガウスが少年時代に行った 計算方法を利用してプログラムを作った記憶が有るなあ 1~aを計算するとして aが偶数なら(1+a)*(a/2) aが奇数なら最初にa+1に対して上と同じ計算をして最後にa+1を引くように すれば簡単に計算できた記憶が有る 例えば a=10(偶数)ならば (1+10)*(10/2) a=11 (奇数)ならば i=a+1 (1+i)*(i/2)-i と場合分けすると式が短くて簡単
- 495 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:44:11 ]
- >>494
なるほどね。 他の方法で暗算だとa,a+1のうち、偶数になる方を2で割ってから掛け合わせたりする。 例: 1~100の場合、100*101/2 = (100/2)*101 1~123の場合、123*124/2 = (124/2)*123 以上は経験的に「奇数の1/2 * 偶数」よりも「偶数の2/1 * 奇数」の方が 暗算しやすいからだけど、プログラムにも活かせると面白いかも。 例えば、少量データで早い実装、大量データで早い実装のように複数の関数を 用意しておいて、稼働状況に応じて使う関数を自動的に切り替える。
- 496 名前:デフォルトの名無しさん [2008/05/11(日) 11:38:08 ]
- str0 = "bar"
の時、マニュアルによると p str0[3, 1] #=> nil らしいですが、自分の環境(1.8.6 mswin32)では""が返ってきます 何が悪いのでしょうか
- 497 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:54:30 ]
- 'bar'[2, 1] #=> 'r'
'bar'[3, 1] #=> '' 'bar'[4, 1] #=> nil 本当だ。なんかバグっぽい挙動だな
- 498 名前:デフォルトの名無しさん [2008/05/11(日) 16:47:40 ]
- fw(findwordの略)というプログラムを作ろうとしています。
fw -fp '/usr/include/**/*.h' '~/**/*.h' -wp 'define\s+\w+' -pp '%1 %2 %3'という感じで -fp の後ろに複数のファイルパターンを -wp の後ろに複数の単語パターンを -pp の後ろに表示用のフォーマットを指定できるようにしたいのですが、optparseをうまく操れません 上記の実行例だと ["/usr/include/**/*.h", "~/**/*.h"] ["define\\s+\\w+"] と表示されて欲しいのですが、実際は ["/usr/include/**/*.h", "~/**/*.h"] ["define\\s+\\w+", "%1 %2 %3"] と表示されてしまいます printpattern = "%1:%2:%3" # filename:linnum:line print = proc {|filename,linenum,line| STDOUT << (printpattern %filename %linenum %line) << "\n" } filepatterns = [] wordpatterns = [] ARGV.options {|opt| dest = wordpatterns opt.on('-fp' , '--filepattern') { dest = filepatterns } opt.on('-wp' , '--wordpattern') { dest = wordpatterns } opt.on('-pp S' , '--printpattern S' , String) {|s| printpattern = s } opt.order! {|s| dest << s } p filepatterns p wordpatterns }
- 499 名前:デフォルトの名無しさん [2008/05/11(日) 18:00:07 ]
- 正規表現に完全にはマッチしてないのだけど、あと数文字付け加えてくれたら
完全にマッチするみたいのを検出したいのですが、いい方法はないでしょうか?
- 500 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:05:01 ]
- >>498
ショートオプションはアルファベット一文字のみ あと質問にはないが、(printpattern %filename %linenum %line) はRubyでは動かない
- 501 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:31:50 ]
- >>499
そのあと数文字を付け加えてない状態を正規表現で表せばいいんじゃない? もっと具体的にやりたいことの例を出してみれ 解決策が出てくるかもしれないよ
- 502 名前:498 mailto:sage [2008/05/11(日) 19:53:16 ]
- >>500
ありがとうございます。 一文字にしたらうまくいきました。 フォーマットは"%1$s:%2$s:%3$s" %[filename, linenum, line]でいけました >>501 499も実は私なのですが、498のプログラムのwordpatternに複数行にも マッチする正規表現を指定できるようにして、それでいて表示にファイル名と行番号も表示できるようにしたいです re = /なんか正規表現/ linenum=1 curtext=nil IO.foreach(path) {|line| if nil==curtext curtext=line else curtext+="\n"+line end if 途中までまっち linenum+=1 next else if 完全まっち print.call(path,linenum,curtext) else curtext=nil end linenum+=1 }
- 503 名前:498 mailto:sage [2008/05/12(月) 00:17:51 ]
- できたー とりあえず動いてるっぽいです
#!/usr/bin/env ruby require 'optparse' if $0 == __FILE__ printpattern = "%1$s:%2$s:%3$s" # filename:linnum:line print = proc { |filename,linenum,line| STDOUT << (printpattern %[filename, linenum, line]) << "\n" } filepatterns = wordpatterns = [] ARGV.options { |opt| dest = wordpatterns opt.on('-f' , '--filepattern') { dest = filepatterns } opt.on('-w' , '--wordpattern') { dest = wordpatterns } opt.on('-p S' , '--printpattern S') {|s| printpattern = s } opt.order! { |v| if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v } } wordpatterns << /\n/ re = Regexp.union(*wordpatterns) text = '' filepatterns.each { |filepattern| Dir.glob(filepattern) {|filepath| next if !File.file?(filepath) linenum = 1 text = IO.read(filepath) text.scan(re) {|m| linenum += $~[0].count("\n") print.call(filepath, linenum, m) if "\n" != $~[-1] } } } end
- 504 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 02:46:36 ]
- >>503
> filepatterns = wordpatterns = [] > if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v filepatterns も wordpatterns も同じだろ、これ。
- 505 名前:498 mailto:sage [2008/05/12(月) 07:55:20 ]
- filepatterns = []; wordpatterns = [] にしますた
- 506 名前:デフォルトの名無しさん mailto:sgae [2008/05/12(月) 19:23:13 ]
- perlの基礎的なスクリプトをたくさん公開しているサイト(KENT WEBみたいな)はいくつかありますが、
rubyのこのようなサイトはないのでしょうか? 今までperlで改造を行っていたのですが、 研究室でrubyを使うことになったので勉強ついでに乗り換えようと思ったんですが…
- 507 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:24:38 ]
- python使った方がいいと思うよ。
- 508 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:45:57 ]
- …そーいえば無いな
あれは日本のperl(というかCGI)の黎明期に乗ったサイトだから仕方ないか PHPにも無いわけだし問題ないかもしれん >>506 研究室で必要な部分だけ習うだけにしておいたほうがいいぞ
- 509 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:48:34 ]
- >>506
今まで見た事はないな そもそも「rubyでCGI」自体がかなりマイナーだから CGI前提のスクリプトも数えるほどしかない Web上の解説記事や書籍を頼りに、自力で何とかするのがいいと思うよ もしくはCGIスクリプトに関してはperlに頼るか
- 510 名前:デフォルトの名無しさん mailto:sgae [2008/05/12(月) 20:36:12 ]
- ありがとうございます。やはり無いですかー…
CGIに関しては今まで通りperlで作ることにします。
- 511 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:43:02 ]
- 何かの言語でCGIが作れるようになったらあとは言語問わずに作れるはずだけどね。
|

|