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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
577 名前:デフォルトの名無しさん [2008/05/18(日) 09:39:51 ] クラスを作っています。 クラス変数の一度の宣言で、 Klass.new do |k| k.high 30 k.width 40 end klass = Klass.new klass.high = 30 klass.width = 40 klass = Klass.new(:high => 30, :width => 40) の全ての記法に対応出来る方法ってあるでしょうか? attr_accessorは知っているのですが、真ん中の記法にしか対応できないですよね。。 どなたかご存じの方宜しくお願いいたします。
578 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 10:16:58 ] そういうメソッドを自分で作る(attr_accessor も実態はただのメソッド)
579 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:03:03 ] 正直、普段から使うほうとしてはどれかひとつに限定して制限してもらったほうが落ち着く インスタンスへのアクセサでもメソッドへの通常引数(順番重要)でもハッシュ引数でもOK、というのはちとしんどい
580 名前:577 mailto:sage [2008/05/18(日) 13:31:45 ] >>578-579 ありがとうございます。 それを聞きattr_accessorが用意されているのでそれで統一したいと思ったのですが、 klass.high = 30 klass.width = 40 とずらずらオブジェクト変数を書くのが面倒です。 みなさんずらずら書いていらっしゃるんでしょうか。 それとも何かいいやりかたがあるんでしょうか?
581 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:55:06 ] > とずらずらオブジェクト変数を書くのが面倒です。 >>577 のは全部ずらずら書いてるように見えるが? 普通にinitializeの引数にすればいいじゃないの 他の2つのが良く見えるのなら、メソッドにブロックかハッシュを渡せるようにするだけ 全部出来るようにするメリットは無いよ
582 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:57:52 ] 未初期化を許容するインスタンス変数以外はコンストラクタの中で埋めてやらないとまずいと思うな
583 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:01:07 ] ずらずらと書く程沢山フィールドが存在する時点で 何かが間違ってるような気もする。
584 名前:577 mailto:sage [2008/05/18(日) 14:12:05 ] >>581-583 ありがとうございます。コロコロ変わって申し訳ないんですが、 未初期化が不味いインスタンス変数がいくつもあるのでコンストラクタでハッシュを取ることにしました。 class BarGraph def initialize(x) @high = x[:high] or 300 @width = x[:width] or 200 etc.. こんなもんでいいんでしょうか。。
585 名前:577 mailto:sage [2008/05/18(日) 14:13:24 ] すいません。orは||です。
586 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:16:51 ] >>583 それの解消は単に initialize に書かなくなったってだけで、他のメソッドの引数が増えるだけだと思う 処理に必要な外部入力の量っていうのは一定だと思うぜ
587 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:17:08 ] >>585 意外と知らない人が多いけど、Rubyではorも使える
588 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:22:01 ] >>587 @foo = nil or 2 としたとき、@foo の値は?
589 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:24:51 ] 本筋からは外れるが high じゃなくて height じゃないか
590 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:25:52 ] foo = (nil or 2) puts foo => 2
591 名前:587 mailto:sage [2008/05/18(日) 14:28:50 ] >>588 ごめんなさい恥かきました
592 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:29:03 ] >>588 が危険だから or は使われないんだよな 知らないわけじゃなくて、結合度の関係で意図的に避けられているだけだ
593 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:31:42 ] 理解してれば普通に使うだけだろう
594 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 14:35:35 ] 結合度表が頭に入ってるって人は旧い人を除いて稀だと思う 表を確認するくらいなら () で括るし、面倒になってきた人はあらかじめ || だけ使うだろう 結合度によるバグは見つけるのめんどくさいバグだから or なら期待通りに動作するが || だと動かない、という例があった気がするがどこだったか
595 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 23:06:14 ] 俺はテスト用のシェル紛いの簡易インターフェイス書くために while print('>>> ')or gets p eval($_)rescue p $! end なんてよく書いてしまう いやirbでも良いとは思うんだけどねw
596 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:12:19 ] 結合度の他には || が式を作るのに対して、 orは文を作るってところか?
597 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:44:20 ] Rubyに文なんてないよ。
598 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:47:36 ] いや、これのことか。 www.ruby-lang.org/ja/man/html/_A5D7A5EDA5B0A5E9A5E0.html >また、メソッドの引数に指定できない式と指定できる式があります(このよう な式 >を「文」と呼び分ける場合があります)。 >メソッドの引数に指定できない式の例 >and, or, not >if/unless/rescue 修飾式, ...
599 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 01:43:01 ] Windowsだけど、 rubyスクリプトをPowerShell上で直接動かすと、 別に、コマンドプロンプトが開いて、そこで実行しちゃうのはなんで? ./hoge.rb で実行すると、コマンドプロンプトが開いてしまう。 ruby hoge.rb だと、ちゃんとPower Shell上で動く。 pythonは ./hoge.py でもちゃんとPower Shell上で動く。 ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32] と、 ActiveScriptRuby 1.8.6(p114) で確認。
600 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 02:52:02 ] >>599 拡張子の関連付けの問題じゃあなかろうか?
601 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 04:25:59 ] >>596 できるよ。 以上。 はい次の方。
602 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 09:09:43 ] >>599 ASRインスコフォルダの bin に行って、ruby.batをいじってみんさい
603 名前:デフォルトの名無しさん [2008/05/19(月) 14:18:14 ] 文字列置換の質問です。 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1) というのがirbだとうまくいくのですが、ファイルに書いて実行するとエラーになります。 in `sub': can't convert nil into String (TypeError) これを解決する代替案はどのようなものがありますでしょうか?
604 名前:デフォルトの名無しさん [2008/05/19(月) 14:21:37 ] >>603 ああ、これFAQレベルの質問だ。 自己解決しました。 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1) かブロックで、 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/) { $1} だ。 irbは2回やったから上手くいったんだ。 自分でメモまでしといたのに忘れるとは・・・。
605 名前:デフォルトの名無しさん [2008/05/19(月) 14:22:06 ] >>604 修正 > puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1) puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,'\1')
606 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 14:25:36 ] 本当に本気でどうでもいいんだけど、 カッコとブレースの間って空白置く派が多いのかな? ){ のほうが個人的には気持ちいいんだけど
607 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 17:26:22 ] >>606 空白置く派だな。 標準添付のもほとんどそのはず。
608 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 17:30:26 ] >>576 自前なのか。 修正済のバグかもしれないので、1.8.6-p114とか1.8.7-preview3あたりで確認を。 それでも落ちるようなら、gdbでバックトレースを。 めんどくさいのでできればBTSに。
609 名前:599 mailto:sage [2008/05/19(月) 20:07:42 ] 結論を言うと、Rubyのせいじゃなくて、 環境変数 PATHEXTに.rbが登録されてないせいだった。 .pyはpythonをインストールした時に登録されてたらしい。 PATHEXTに登録されてない場合に、 関連付けでコンソールアプリが実行されると、 コマンドプロンプトが開くのがデフォみたい。 でも、いまいち納得できないな。 どちらにしろ、コマンドプロンプトなんか開く必要無いのに。
610 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:21:55 ] winの設計思想のなんたるか、だねえ じき滅ぶよ、きっと
611 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:32:20 ] 人口に膾炙して10年以上も経ってるのにまだそんな口きくかね
612 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:52:05 ] んー、既に自滅した気が、なんて言ったっけ、VIS...
613 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:18:21 ] コンピュータが始まってまだ60年ぐらいしか立ってないから。 無くなるときは割とあっという間だと思うよ。多分携帯に駆逐される。
614 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:30:12 ] PC-98 って何で死んだんだろな
615 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:31:09 ] 坊やだからさ…
616 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:56:00 ] 漢字ROMに守られていた文化が 黒船に駆逐されたからでしょ
617 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:05:26 ] それまでは「パソコン」がプラットフォームの中心だったのが Windowsに中心が移ったから。
618 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 19:28:28 ] Windowsが本当に駆逐されたら困るなー、と思う反面 代わりにLinuxが台頭するのはちょっと見てみたいとも思う >>606 俺は空白置かない(くっつける)派 標準ライブラリでは二派に分かれているようだ (検索したら、空白置いてるファイルが置いてないファイルの二倍ぐらいあった)
619 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:41:14 ] WindowsにRuby/GDまたはRuby/GD2を使いたいのですが、どうすればいいですか? cygwinやcoLinuxではなくWindows上で直接動かす方法をご存知の方教えていただけるとうれしいです _ _
620 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 16:49:38 ] コンパイルしろ。
621 名前:555 mailto:sage [2008/05/21(水) 23:42:24 ] >>608 返事が遅くなってすみません。 1.8.6-p114とか1.8.7-preview2 とかをインストールしたのですが 基本的に同じような結果になってしまいます。 >> gdbでバックトレースを。めんどくさいのでできればBTSに。 これはどのようにすればいいのでしょうか?自分なりに調べてみたいのですが どうすればいいのかよくわかりませんでした。
622 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:50:56 ] >619 ちなみにmingw版でコンパイルしたsoはmswin32でもそのまま使える (libの下のso入れるとこに突っ込めばおk)
623 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 20:57:12 ] 「みるみるRubygがわかる本」 は、初心者に勧められる入門書ですか? 購入なさった人、情報を持っている方など 感想等お願いします。
624 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:03:06 ] プログラミング自体初心者には www1.tf.chiba-u.jp/~shin/tutorial/index.rb Ruby初心者には、他の言語の習熟レベルにもよるけど、 たのしいRubyかプログラミングRubyがいいんじゃないかな。 # その本の批評じゃなくてごめんね。 # 漏れは秀和ということだけで毛嫌いしちゃう
625 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:12:50 ] >>623 別に気にしなくていいんだけど、 立ち読みは表紙のイメージで記憶してるので書名で言われてもぶっちゃけ覚えてねー ttp://www.amazon.co.jp/dp/4798019291 で、これな 「何が何でもとにかく『たのしいRuby第2版』との差額900円が惜しい人向け」 だ 900円がないと明日家賃が払えないけど Rubyの本を何か持ってないと明後日異界に連れ去られてしまうとかそういう人向け
626 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:13:42 ] あ、あと、ある一定以上の重量の本を手に持つと骨が折れる人とか
627 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:23:38 ] 書籍にあるサンプルコード ttp://ftp2.shuwasystem.co.jp/pub/book/1929/sample-list.txt ……うーん…
628 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:35:17 ] 3-*あたりを見るとJavaっぽいね。 RubyではgetEuroなんてまず書かない。 多分、to_euroとか
629 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:40:56 ] なんだ秀和か。 あそこの本は、よそで出てないネタを押さえてる本は買う価値があるが、 よそで出てるネタの本は微妙な出来のことが多いな。
630 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:46:28 ] >>627 とりあえずcaseのインデントが気持ち悪すぎる
631 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:48:42 ] >>628 > Javaっぽい なかなか鋭い ttp://www.amazon.co.jp/s/ref=sr_st?__mk_ja_JP=%83J%83%5E%83J%83i&rh=n%3A465610%2Cp_27%3A%8F%B6%93c
632 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:53:50 ] >>627 はftpだな ftp://ftp2.shuwasystem.co.jp/pub/book/1929/sample-list.txt ってftpかよ! まあいいけど
633 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:57:31 ] Javaな奴にRubyの本を書かせるな めんどくさいから
634 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:01:41 ] >>631 やはりJava・・・・・・・なのか? 入門書ばっかり しかも売上が微妙なのかレビューがほとんどついてないのばっかりか
635 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:02:31 ] Rubyは『たのしいRuby』いっとけで済むからいいよな サポートサイトのエラッタを見ても頭ひとつ抜けてる感じだ 無理やり難点を挙げるなら熱さやユーモアに欠けるぐらいか
636 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:07:59 ] 本当は色々な入門書やら解説書やらが出ていいのも悪いのも結構ある、というのが理想 『たのしいRuby第2版』 し か な い というのが現実 スレ的には面倒がないが、言語普及的には好ましい状態ではない
637 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:09:58 ] Rubyで小金が儲かる、という状態でないとなあ Rubyの書籍は売れないから出しません、というような状況になるのはまずい
638 名前:623 mailto:sage [2008/05/23(金) 22:23:55 ] 皆さん情報提供ありがとうございました。 『たのしいRuby第2版』の情報等も参考にさせていただきます。
639 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:26:18 ] 他言語を知ってるならピッケル本が良いんだが
640 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 22:37:12 ] Rubyの新しい本はRails含めて最近ちょくちょく出てるんだが、いまいちパッとしない ttp://www.amazon.co.jp/dp/4798019437/ これは、読んだ限りではまあ、うん、まあ、同価格帯で勝負するだけはあるなって感じはするが 目次はここ ttp://www.shuwasystem.co.jp/products/7980html/1943.html
641 名前:デフォルトの名無しさん [2008/05/24(土) 10:10:42 ] Amazon/AWSのResponseオブジェクトをprintで出力すると 長々と内容まで出力してくれるのですが、ppで出力すると #<Amazon::AWS::AWSObject:0x2f82e04 ...>としか出力されません。 ppで整形した内容まで出力してくれるようにするにはどうしたらいいのでしょうか?
642 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 10:46:40 ] >>641 今こそソース読んでステップアップするとき pp.rb を読むんだ
643 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 16:31:14 ] Rubyからaccessのmdbファイル内のレコードを操作するにはどうしたらいい?
644 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:14:05 ] ttp://jp.rubyist.net/magazine/?0005-Win32OLE そういう目的のためのwin32OLE。 あまり使ったこと無いので、使いやすいのか知らんけど
645 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:38:16 ] win32OLEは便利だと思うけど、詳しい解説がどこにあるのかがわからない。 るびまは読んだんだけどなー
646 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 19:10:13 ] WIN32OLEクラスの使い方さえ覚えれば、 あとはWSHの話じゃないか?
647 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 19:24:37 ] WSHというか、あとはそのライブラリ自体のお話ってことだよねぇ。
648 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 20:10:56 ] AccessのVBAでマクロ組んで、Rubyからそのマクロを呼ぶのが一番簡単そう。 Rubyから呼ぶ必要があるかどうかは知らんけど。
649 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 20:29:03 ] 実のところRubyはほとんど関係ないんだよな 単純にWindowsプログラミングの話になってしまう
650 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 20:30:49 ] >>649 本質的には system() で外部コマンド呼んでるだけだからねえ… どんなときにどんなコマンドを呼び出すべきかってのはRuby関係ないわな…
651 名前:643 mailto:sage [2008/05/24(土) 20:43:37 ] >>644 のリンク先の一行レコードを追加するスクリプトサンプルみると conn = WIN32OLE.new("ADODB.Connection") 以降はvbaと同じっぽいのでなんとかやれそう
652 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 01:36:18 ] open-uri を使って ftp にアクセスしたい。 require 'open-uri' uri = URI.parse("ftp://hogehoge.com/bar/") uri.user = 'foo' uri.password = "fu/ha" でエラー。uri/generic.rb の USERINFO(Regexp) が /^(?:[-_.!~*'()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*$/n になっているのが原因で パスワードに '/' を含む事が出来ない。 URI.escape(password) をしても '/' はエンコードされず。 何か策はないでしょうか? (パスワードは変更できない) open(uri) の uri にパスワードを含めれないのか? net/ftp を使えばログイン出来るのだが、やりたいのは、 Pathname を使って ディレクトリを掘りながら put をしたい。
653 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 01:54:51 ] URI::USERINFO= /^(?:[-_.!~*'()a-zA-Z\d;:&=+$,\/]|%[a-fA-F\d]{2})*$/n とか
654 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 02:11:13 ] まあ基本的には無理だな 自前で書き換えるしかないわ スラッシュって含むことできたっけ?
655 名前:652 mailto:sage [2008/05/25(日) 02:44:45 ] >>653 素敵。 しかし別の新たなエラーが。もう少し調べます。(そもそも 掘って put は出来るのか?) ありがとうございます。
656 名前:652 mailto:sage [2008/05/25(日) 02:57:43 ] わかった。open-uri は ファイルを扱うものなのか。 ディレクトリは扱えないのか。 失礼しました。
657 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 04:48:04 ] まつもとゆきひろがB型肝炎に感染 mamono.2ch.net/test/read.cgi/newsplus/1211364904/
658 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:24:45 ] 質問です。 #!/usr/local/bin/ruby print "Content-type: text/html\n\n" print "<html><body>Hello World</body></html>" この内容の.cgiファイルを land.to/newshiyou.php このレンタルサーバーにアップしたのですが。 500内部サーバエラーになってしまいます。 なぜなのでしょうか?どうすれば動かせるのでしょうか? 回答よろしくお願いします。
659 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:35:52 ] エラーメッセージの意味がわからんです おしえてエロイひと c:/ruby/lib/ruby/1.8/xmlrpc/parser.rb:152:in `fault': wrong fault-structure: {"f aultCode"=>"Client", "faultString"=>"Application failed during request deseriali zation: \nnot well-formed (invalid token) at line 6, column 345, byte 3640 at /h ome/seesaa/cpan/lib/i686-linux-thread-multi/XML/Parser.pm line 187\n"} (RuntimeE rror)
660 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:52:12 ] >>659 文字コードの知識もないspamブロガーさんこんにちは
661 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:56:29 ] >>660 そう見えるよなあ 投稿スクリプトをサンプルとして提供するのは止めたほうがいいと思うぞ で、まあ、seesaaはShift_JISだったはずなのでShift_JISで送れ
662 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 16:07:16 ] >>658 CGIファイルのパーミッションを実行可能に変更していないのだと予想
663 名前:658 mailto:sage [2008/05/25(日) 16:41:39 ] 解決しました。 ありがとうございました。
664 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 17:38:53 ] 【プログラム】 #! ruby -Ks class Ice def sizeIce(size) print(size) end end class IceName < Ice def initialize(name="未設定") @iceName = name end attr_accessor :iceName end class IceSize < Ice def initialize(size="未設定") @iceSize = size end def sizeIce(size) super(size) print("サイズです。\n") end attr_accessor :iceSize end ice = [IceName.new("メロンソーダ"),IceName.new("レモン&ライム"),IceName.new("スイカバー")] ice2 = [IceSize.new("中"),IceSize.new("小"),IceSize.new("大")] for k in 0..ice.size-1 print(k+1,"個目 ",ice[k].iceName,"は",ice2[k].sizeIce(ice2[k].iceSize)) end
665 名前:664 mailto:sage [2008/05/25(日) 17:44:59 ] 【表示される結果】 中サイズです。 1個目 メロンソーダはnil小サイズです。 2個目 レモン&ライムはnil大サイズです。 3個目 スイカバーはnil 【表示したい結果】 1個目 メロンソーダは小サイズです。 2個目 レモン&ライムは大サイズです。 3個目 スイカバーは中サイズです。 昨日からrubyの勉強を始めました。 初めてのプログラミングなので、わからないことが多々あり苦戦しております・・・。 上記のプログラムを実行するとエラー等は出ないのですが、表示結果が思い通りになりません。 なぜ一番最初に「中サイズです。」が表示されるのかすら理解できません。 一体どの部分に問題があるのでしょうか? わかりにくいプログラムだとは思いますが、もしよろしければ回答お願いします。 ※このプログラムは、練習目的で作っているのでわざわざ面倒なことをしています。
666 名前:664 mailto:sage [2008/05/25(日) 17:46:44 ] 訂正 【表示したい結果】 1個目 メロンソーダは中サイズです。 2個目 レモン&ライムは小サイズです。 3個目 スイカバーは大サイズです。 でした。すいません。
667 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 17:59:29 ] (半分ほど作り変えた時点で悩む) あー、まあいいや print は引数をその場で画面に表示し、返り値として nil を返す 表示部とデータ部を完全に分けて考えるべき 最終的なデータを最後に print で表示するだけ、という考え方な Ice.sizeIce で print を使っているのはよくない
668 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 18:16:52 ] てゆーか、継承の考え方がおーざっぱに間違ってね? 「アイスの価格」が「アイス」というクラスを継承するはずがない 「アイスの名前」や「アイスの価格」は「アイス」というクラスの変数であるべき class Ice def initialize(name=nil, size=nil) @name = name @size = name end attr_accessor :name, :size end data = [ ["メロンソーダ","中"], ["レモン&ライム", "小"], ["スイカバー", "大"] ] products = Array.new data.each do |a| products.push(Ice.new(a[0], a[1])) end products.each_with_index do |ice, i| puts "#{i+1}個目 #{ice.name}は#{ice.size}サイズです" end
669 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 18:22:51 ] 抽象的に「アイス」があって、 「価格のあるアイス」とか「サイズのあるアイス」とか「価格とサイズのあるアイス」と 具体化...と考えているのかもしれないが、そういう継承の使い方はあっさり破綻するので やめたほうがよい。 まずは合言葉「継承は最後の武器だ」かと。
670 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 18:34:03 ] >>664 k == 0 の時の出力 中サイズです。 1個目 メロンソーダはnil k == 1 の時の出力(最初の行は↑の行に続けて出力) 小サイズです。 2個目 レモン&ライムはnil k == 2 の時の出力(は省略) 「?サイズです。」はice2[k].sizeIce(...)メソッド実行時の出力 「?個目 ***はnil」がループ内のprintの出力 最後のnilはice2[k].sizeIce(...)の返却値 # sizeIce(...)最後のprintの返却値 # k== 0 の時 print(1,"個目 ","メロンソーダ","は",nil) になっている 問題は「経験が足りない」事 もっとたくさんソースを書いて実行してデバッグすれ
671 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 18:42:30 ] マニュアルには「返り値」「戻り値」があるけど「返却値」はないな …なんで2種類あるんだ マニュアルくらいどっちかに統一せえ
672 名前:664 mailto:sage [2008/05/25(日) 18:53:18 ] >>667-670 レスありがとうございます。 どうやら自分の言葉足らずだったようです。 現在こちらのサイトさん(www.rubylife.jp/index.html )のRuby入門というところを一番上から進めています。 現在は「Rubyオブジェクト指向プログラミング」の「クラスの継承」の部分まで読み終えています。 ひとつの項目が終わるごとに、その項目で覚えたメソッド等を使ってプログラムを作る練習をしているのです。 なので今回は「クラスの継承」「オーバーライド」「super(引数)」の3つを使ったものを作ろうとしていました。 ・・・と自分で考えたらあんな感じになってしまったのですが、このような使い方はそもそもおかしいようですね。 色々混ぜすぎて自分でも分けがわからなくなってましたし。 次回からはもっと処理を個別に分けてプログラミングするように心がけます。 クラスの継承は結構重要そうな感じだけど、実際はそこまで実用性があるわけじゃないのかな・・・。 一番最初に「中サイズです。」が出てきてしまう理由や、「nil」が表示される問題などは解決しました。 >>668 さんのような配列の書き方は非常にわかりやすい・・・次からはこのように表記したいと思います。 大変わかりやすく解説していただきありがとうございました。
673 名前:デフォルトの名無しさん [2008/05/25(日) 20:35:05 ] すみません、マニュアルみたりしてるんですが、見落としてるのか分からないので、教えてください。 クラスの定義の中にたまに、「:」がでてくるんですが、:の意味を教えてください。 たとえば、 Railsだと、「t.string :title」な表現があったり、 インスタンス変数のアクセサを作るときは、「attr_accessor :x, :y」とかしますよね。 この:の意味が掴めないですorz class CreateArticles < ActiveRecord::Migration def self.up create_table :articles do |t| t.string :title t.text :description t.string :image_url t.decimal :price t.datetime :date t.string :vender t.string :category t.timestamps end end def self.down drop_table :articles end end
674 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 20:41:49 ] それはシンボルというものだ
675 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 21:18:50 ] というか、Symbol クラスのインスタンスだと説明したほうがいいかも Rubyのメソッド名や変数名は内部的に数値で管理されてる (2455番目に登録されたメソッド、とかそんな感じで、オブジェクトIDとは別物) シンボルは、その数値に文字でアクセスすることができる機構だ 結果として、「文字」でメソッド自体を指し示すことができる 普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる 腹減ってるので自分でも何書いてるかわからなくなってきた 試しに適当な変数作って、それと同じ名前のシンボルに to_i してみ それが内部整数値だ シンボルを id2name するとシンボルに対応する文字列が返る 時々「シンボルを文字列にする」という表現で説明されるがこれは本当は誤り
676 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 21:26:03 ] 余計わからなくなるので>>675 は読まなくてよし もう遅いかもしれんが
677 名前:デフォルトの名無しさん [2008/05/25(日) 21:31:28 ] >>674 >>675 さきほど、rubyの公式にアクセスできたので、FAQ見てたらシンボルということは分かったところで、余計に理解に苦しんでましたが、、、 >>普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない >>しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる 神レスありがとうございました!よく分かりました!!