- 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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
- 331 名前:デフォルトの名無しさん [2008/04/29(火) 13:34:16 ]
- すいません、思いだしました!
Rubyで小物でもプログラムを書くときに、 クラス化しますか? 適当に書き下す(とは言っても100行オーバーの大きさ)場合はトップレベル関数ばりばりでも よいと思うのですが、関数作りまくるプログラミングタイプだと、 いちいち関数化時に変数をグローバルにするのが面倒です。 また、配布とかも考えると、クラス化してライブラリとして使えるようにも、と思ってしまいます。 あなたはどうしてますか?
- 332 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:01:16 ]
- うぜぇw
- 333 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:02:37 ]
- 配布を考える場合は、規模問わずほぼ確実にクラス化(モジュール化)する
配布を考えないなら、そのときどき トップレベル関数(メソッド)から作り始めることもあれば クラスの設計から始めることもある ところで >いちいち関数化時に変数をグローバルにするのが面倒です。 これはどういう意味なんだ
- 334 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:19:14 ]
- この俺がエスパーしよう!
name = gets.chomp hello = 'ぐっもーにん' puts "#{name}さん、#{hello}" をメソッドにすると def say_hello puts "#{$name}さん、#{$hello}" end $name = gets.chomp $hello = 'ぐっもーにん' say_hello と書かなければならなくなって面倒だとか、たぶんそういう話だ!
- 335 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:33:57 ]
- トップレベルは気持ち悪いからなんでもクラス化
- 336 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:35:08 ]
- とりあえず関数だけで書いて
複雑になってきたらリファクタリングしてクラス化
- 337 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:42:55 ]
- 100行くらいなら、多分関数のみ
- 338 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 14:47:37 ]
- メソッドのことを関数と言ってる奴は同一人物
- 339 名前:デフォルトの名無しさん [2008/04/29(火) 15:12:32 ]
- >>333
>>いちいち関数化時に変数をグローバルにするのが面倒です。 >これはどういう意味なんだ >>334 そのとうりです!! >>338 トップレベルメソッドというべきでしたか?
- 340 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 15:59:49 ]
- 確か三年ぐらい前に、初心者だった自分も同じようなことを言われたんだが
グローバル変数の使用はお薦めしない(書き捨ての短いコードだとしても) エスパー>>334の例を借りると def say_hello(name, hello) puts "#{name}さん、#{hello}" end say_hello(gets.chomp, 'ぐっもーにん') こんな風に引数として渡したほうがいい
- 341 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 16:47:55 ]
- いくらなんでも324はないだろう
def init(opt) $_option = opt end def exe(arg) if $_option[:foo] 〜 end init :foo => :bar exe "hoge" とか?
- 342 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 16:53:28 ]
- 俺の場合は新規作成した場合、自然と指が
class って動いちまうなあ。
- 343 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 17:03:15 ]
- Pythonと比べるとRubyの方が直感的だと感じてしまうのはRubyに毒されたからなのか。
yieldの書き方とかはRubyの方がいいな。
- 344 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 17:06:54 ]
- コルーチンがわかってないんだろ
- 345 名前:デフォルトの名無しさん [2008/04/29(火) 17:35:41 ]
- >>342
毎回指で書くなら自動化すればいいじゃない
- 346 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 17:47:28 ]
- これがコルーチンか。そう意識してみるとPythonの書き方もこれでもいいかと思えてくる。
でもRubyの方がコルーチンを中断している途中でなんか処理しているってイメージがしやすい気がする。 気のせいか慣れなのかもしれないけど。
- 347 名前:デフォルトの名無しさん [2008/04/29(火) 22:15:27 ]
- メソッド・オーバーライトって、具体的に、どんなときに使ったことありますか?
- 348 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 22:31:43 ]
- ライブラリのメソッドを上書きしたいとき
- 349 名前:デフォルトの名無しさん [2008/04/29(火) 22:49:20 ]
- それはわかるんだけど、具体的にどんなメソッドを上書きしたの?
- 350 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 23:10:38 ]
- inspect はしょっちゅうオーバーライドしてるなあ。
あと to_s も。
- 351 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 23:49:21 ]
- >>349
OKまずはageだ ・自分で設計したクラスのサブクラスを作ったとき(基本) ・他所から持ってきたライブラリのバグを自分で直すとき ・ライブラリの挙動を少しいじくったり、機能を足したいとき(たいていサブクラスを作って上書きする) 上書きコードがある程度の量になってきたら、自分用のラッパーライブラリを作ることもある
- 352 名前:デフォルトの名無しさん mailto:sage 懐かしのuwarite [2008/04/30(水) 00:41:49 ]
- 再定義はオーバーライト(overwrite)じゃなくてオーバーライド(override)だな。
- 353 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 01:19:44 ]
- そういえば、Object#inspectって循環参照があるオブジェクトに対してもちゃんと動くよね
これってどうやって検出してるんだろう。inspectは特に引数を受け取るでもないし
- 354 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 07:48:36 ]
- >>353
Thread.current[:__inspect_key__] でobject_idを覚えてる。
- 355 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 09:26:26 ]
- >>354
スレッドローカルストレージ使っているのか。なるほど。 353じゃないが参考になった。 これからもあわあわと質問に解凍しやがってください。
- 356 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 11:34:29 ]
- >>354
そういうことかー。返答ありがとう。
- 357 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:32:29 ]
- javaが呼べるのは便利そうだけど
c++(cじゃなくて)の呼び方がまとめてあるサイトないですか?
- 358 名前:デフォルトの名無しさん [2008/04/30(水) 19:38:33 ]
- railsでないRubyではDB操作するのに何が一番使われてますか?
素のライブラリ?DBI?ActiveRecord?
- 359 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:38:38 ]
- O/R MapperならActiveRecordかDataMapper
そうでなければDBIかMySQLライブラリ直書き
- 360 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:28:23 ]
- activerecordだけ使うならrailsでやればいいのに
って思う。
- 361 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:31:00 ]
- 「Rails使うならActiveRecord使えばいいのに」なら分かるが
その逆はイミフだなぁ。
- 362 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:18:14 ]
- initializeを勝手に呼び出すのは良くないんでしょうか。
class Foo ... def refresh initialize end end
- 363 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:38:07 ]
- よくないです
っていうか、そういうような処理を initialize に書いたらダメです たとえば、別途セットアップ系のメソッドを作って、initialize と refresh から呼ぶようにするとかしてください
- 364 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 18:32:18 ]
- >>363
なんでよくないの?
- 365 名前:デフォルトの名無しさん [2008/05/01(木) 19:28:22 ]
- >>340
あー、わかります。 でもRubyは参照渡し?できないですよね。 単発なら返却値で返す。 複数の返却値だとタプル?じゃなくて配列で返して、 hoge, mage = gethogemage でよかったと思うんですが、なれてないと妙に気持ち悪いw みんなこんなのやってんのかな >>342 まず体を慣らすのはいいかもですねw 私も一番慣れてる言語だと、ファイル新規作成したら無意識でclass構文が書けます(まあ大抵はスニペット使いますけど)
- 366 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:27:49 ]
- >365
Rubyはむしろ全て参照渡しと言っても良いくらいなのだが。 ただし代入(=、+=など)は変数の参照先を変えてしまうので 自身を書き換えるメソッドを使わず代入で書き換えようとした場合 変数の参照先が変わり、値渡しみたいに見える。 例えば文字列なら concat は文字列自身を書き換えるが += は新しい文字列を作り変数の参照先を書き換えるので元の変数に影響がない。 FixnumやSymbolなどは、自身を変更するメソッドを持たないので 実質的に値渡しになる。
- 367 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:29:19 ]
- >>364
べつにいいと思うよ、何度呼ばれてもいいように設計されていれば。 foo = Foo.new(0) # Foo#initialize(0) が呼ばれる foo.do_something! foo.initialize(0) # リセットする foo.do_something! foo.initialize(0) # リセットする ... もちろん>>363のようにしてもいい。すきにどうぞ。
- 368 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 23:57:27 ]
- 正規表現でCの文字列リテラルにマッチするようなのって書けないでしょうか?
/".*?"/にすると"aaa\"bbb"みたいな場合に"aaa\"で終わってしまいますが全体にマッチして欲しいんです /".*(?<!\\)"/にしようと思ったら1.8では(?<!)が使えませんでした
- 369 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:03:40 ]
- "([^"]*?\\.)*.*?"
とかよく書くけど、どうかな
- 370 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:12:20 ]
- /"([^"\\]|\\.)+"/
こんな感じ?
- 371 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:28:07 ]
- >>369 >>370
どちらでもいけました、ありがとうございます! なんでこれでいいのかまだ良くわからないので頑張って解読します
- 372 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:12:18 ]
- >>371
/"[^\\"]*(\\.[^\\"]*)*"/ こっちのほうが早いかな。 詳説 正規表現を読むのをオススメするよ
- 373 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:15:20 ]
- db等の外部リソースを使った時は
Rubyの終了時にメモリは自動的に解放されているのでしょうか? 明示的に解放しないとだめですか?
- 374 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:21:27 ]
- ここでいいのか不明なのですが…もし良ければおしえてください
やりたいことは CarbonEmacs上にて起動したirbで require 'rubygems' を行いたい。です。 環境は OSX10.4にてCarbonEmacs2008春版を使用しています。 rubyはMacPortsからインストールしたものを使用し、 rubygemsもMacPortsからインストールしました。
- 375 名前:374 mailto:sage [2008/05/02(金) 03:23:56 ]
- 以下Terminal.appから実行した結果です
/Users/hoge% uname -a Darwin hoge.local 8.11.1 Darwin Kernel Version 8.11.1: Wed Oct 10 18:23:28 PDT 2007; root:xnu-792.25.20~1/RELEASE_I386 i386 i386 /Users/hoge% ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1] /Users/hoge% which ruby /opt/local/bin/ruby /Users/hoge% gem -v 1.1.1 /Users/hoge% which gem /opt/local/bin/gem /Users/hoge% echo $PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin /Users/hoge% irb irb(main):001:0> puts $: /opt/local/lib/ruby/site_ruby/1.8 /opt/local/lib/ruby/site_ruby/1.8/i686-darwin8.11.1 /opt/local/lib/ruby/site_ruby /opt/local/lib/ruby/vendor_ruby/1.8 /opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin8.11.1 /opt/local/lib/ruby/vendor_ruby /opt/local/lib/ruby/1.8 /opt/local/lib/ruby/1.8/i686-darwin8.11.1 . => nil irb(main):002:0> require 'rubygems' => false -------- rubygemsをrequireしてもエラーになりません。 (.irbrcにてrequire済なので再読み込みはしませんが)
- 376 名前:374 mailto:sage [2008/05/02(金) 03:25:02 ]
- 対してCarbonEmacs上のrun-rubyにて起動したirbでの実行結果です
irb(main):001:0> puts $: /usr/lib/ruby/site_ruby/1.8 /usr/lib/ruby/site_ruby/1.8/powerpc-darwin8.0 /usr/lib/ruby/site_ruby/1.8/universal-darwin8.0 /usr/lib/ruby/site_ruby /usr/lib/ruby/1.8 /usr/lib/ruby/1.8/powerpc-darwin8.0 /usr/lib/ruby/1.8/universal-darwin8.0 . nil irb(main):002:0> requrie 'rubygems' NoMethodError: undefined method `requrie' for main:Object from (irb):2 -------- 実行時のパスが異なるようです どのようにしたら、この問題を解消できるでしょうか。
- 377 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:33:48 ]
- うん、そのtypoは俺もよくやるよ
- 378 名前:374 mailto:sage [2008/05/02(金) 03:52:32 ]
- >>377
まちがえました…ご指摘ありがとうございます typoしなくても以下の通りです irb(main):001:0> No such file to load -- rubygems from (irb):1:in `require' from (irb):1
- 379 名前:デフォルトの名無しさん [2008/05/02(金) 05:40:38 ]
- >>366
オブジェクトが参照なのと、引数の参照渡しを一緒にスンナ 何が「すべて参照渡しと言ってもいいくらい」だ
- 380 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:10:57 ]
- 「参照の値渡し」とか「オブジェクト渡し」とか言われる形態だな
- 381 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:35:21 ]
- >>378
FinderからではなくTerminal上で open -a Emacs とする、 もしくは .emacsに irb の位置をフルパスで指定する、のどちらか。 後者なら、~/.emacsなどに (setq ruby-program-name "/opt/local/bin/irb") と書けばいいと思う。たぶん。
- 382 名前:デフォルトの名無しさん [2008/05/02(金) 15:43:21 ]
- TechCrunch Japanese アーカイブ ? Twitter、Ruby on Railsを放棄か
ttp://b.hatena.ne.jp/entry/jp.techcrunch.com/archives/20080501twitter-said-to-be-abandoning-ruby-on-rails/
- 383 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 18:21:49 ]
- Emacs から info で Ruby のマニュアルを調べたいと考えているのですが、
現在、配布されているドキュメントは html 形式のみですよね Ruby 1.4 の時に配布されていた info ruby-texi-1.4.tar.gz も、ネット上のどこにも落ちていない…
- 384 名前:374 mailto:sage [2008/05/03(土) 00:25:29 ]
- >>378
感謝です。おっしゃるとおりでした。 後者も有効です。
- 385 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:38:08 ]
- Rubyに抽象メソッドって無いの?
- 386 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:14:12 ]
- >>385
実行前に実装を強制させる仕組みはない。 定義してなければ呼んだときにmethod_missingが呼ばれる。 あとは スーパークラスで抽象メソッドにしたいメソッドを定義して raise NotImplementedError するとか inheritedフックを使って、継承した時点でチェックするとか。
- 387 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:31:01 ]
- >>386
Class#inheritedがよさげです ありがとうござました
- 388 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:45:07 ]
- inheritedって class Hoge < Moge の中を実行する前に呼ばれてるような。
- 389 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:45:28 ]
- どうしてruby使ってるの?
pythonでなくてrubyを使う理由って何でしょう? 日本人が作ったのが誇らしいとかですか????
- 390 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:50:50 ]
- ?が2個以上連続しているレスは釣り
- 391 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:15:38 ]
- Ruby 初心者スレッド Part 18
pc11.2ch.net/test/read.cgi/tech/1203658291/623 623 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/24(月) 14:34:59 どうしてrubyなの? 実績も何も無い言語ですよね pythonじゃなくてrubyを使う理由を一つでもいいから教えてください 開発者が日本人なのが誇らしいとか??????
- 392 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:18:17 ]
- >>389
どうして日本語使ってるの? 英語でなく日本語使う理由って何でしょう? 日本人が作ったのが誇らしいからですか????
- 393 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 01:11:30 ]
- イエス!ジャパニーズ!
ノー!フューチャー!
- 394 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 02:41:51 ]
- pythonはopen classじゃないとかいろいろめんどい
openclassはちゃんとしたアプリがつくれない、って言われてるけど その通りだと思う。でもスクリプト(笑)言語でちゃんとしたアプリは 作らないから問題ない。
- 395 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 07:31:41 ]
- 式と文や、メソッドと属性なんかが分かれてるのが気に入らない。
- 396 名前:デフォルトの名無しさん [2008/05/04(日) 11:46:23 ]
- クラス内部でしか使わないサブルーチンのようなメソッド定義ってできますか?
たとえば、 class Hoge def a(int1, int2) return int1+int2*int2 end def self.b(int) p a(3, int) end end Hoge.b(5) の様には書けないんでしょうか。 classとselfとHogeを外すと正常に動作するんですが。
- 397 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:55:54 ]
- Pythonは「メソッド=メソッドオブジェクトが入った属性」な感じ?
メソッド側に属性を統一するのがRuby流で 属性側にメソッドを統一するのがPythonって思ってる。 俺の場合はlambdaの使い難さで使わないけどな。>>Python 文が書けないし、構文自体が無茶になるから 結局、一時的な関数内関数を書きまくることに。
- 398 名前:デフォルトの名無しさん [2008/05/04(日) 11:58:13 ]
- aをselfしてprivateに指定するんでしょうか?
- 399 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:03:11 ]
- >>396
クラスメソッドとインスタンスメソッドと特異メソッドの勉強が必要
- 400 名前:デフォルトの名無しさん [2008/05/04(日) 12:06:21 ]
- 観念的なのは10冊くらい読んだのですが、結局、よくわからんのです。
実際の挙動というか、メモリ上の状態を記述しているような 説明がないので。 一応、インスタンスはコピーという感じで良いんでしょうか。 クラスと特異の実際の状態が掴めないのでよく解りません。
- 401 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:17:25 ]
- >>400
中田育男先生の コンパイラの構成と最適化 お勧め
- 402 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:20:51 ]
- つprivate_class_method
- 403 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:34:20 ]
- >>396
self.bの定義の中ではselfは(挿入されている特異クラスはさておき) Hogeというクラスそのものなわけだが、このとき(レシーバを 省略した)aの呼び出しでも、当然レシーバはself(=Hogeクラス) になる。
- 404 名前:デフォルトの名無しさん [2008/05/04(日) 13:04:58 ]
- >>400
この辺はじっそうによるからなあ。 コード書いてみて、実験したりして挙動を確かめる方が身につくよ。 本も大事だけどさ コード書かないで理解は無理だべさ
- 405 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 13:18:59 ]
- >>396
まずどういう目的で、何をするためのスクリプトを書いてて詰まったのか そこを書いた方が回答しやすい 学習目的なら、特異メソッド(Hoge.b)の理解は後回しで良い それよりも、まずクラスとインスタンスの概念を理解することが先
- 406 名前:デフォルトの名無しさん [2008/05/04(日) 14:10:12 ]
- >>405
目的はある処理をするクラスを作っていて、 クラス内部の処理を解りやすくするために、関数で処理を まとめようとしていました。 色々と処理の分岐があるので、その方が解りやすく書けるからです。 新たにクラスを作るほどは大きくなく、下手に複数のクラスにして データのやりとりで悩まなくていいし、1ファイルに納めるのに 都合が良いからです。 しかし、メソッドを定義してやると、クラス外からも呼び出せるし、 何か気持ち悪いので良い方法はないのかと思って聞いてみました。 そもそも、クラスの使い方が間違ってるような気もしていたので。 クラスから自身を呼んでインスタンス化するというのも、 自身の、呼び出した部分のコードがメモリに読まれるので、無駄な気がするし。
- 407 名前:デフォルトの名無しさん [2008/05/04(日) 14:57:18 ]
- >>401
読んでみます。 >>402 やはりプライベートにして、アクセスを禁止してしまえば良いんでしょうか。 >>403 なるほど。再帰的に呼び出してるわけですよね。 クラスを呼ぶのでクラス指定しないとダメなんですかね。 クラス内だから関数的に呼べるのかなとも思ったんですが。 なんとなくあやふやな感じで理解してましたが。 selfを付けるのと付けないのでどういう違いが 発生するのかいまいちよくわからないのですよね。 selfを付けると、スクリプトの実行時に既に実行可能になってるのか それとも、クラスが呼ばれたときに実行可能になるのかとか。 >>404 そうですか。あはは。 オブジェクト指向って奥が深いですね。 何か図形的なモデルがあると理解し易いんですが。 きっと複雑な状態遷移があると思うので、 言葉だけではすぐに理解するのは難しいのかなと。
- 408 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 15:55:51 ]
- 説明が漠然としててよく分からんが
Hogeのインスタンスを作っており、なおかつ外部から呼ばれたくないメソッドなら 普通にプライベートメソッドでOK あとself.bは、クラスメソッドの定義なので クラスの外でもHoge.bと書けば呼べてしまう 詳しくはリファレンスマニュアル内、「クラスメソッド」の項を参照 ttp://www.ruby-lang.org/ja/man/html/_A5AFA5E9A5B9A1BFA5E1A5BDA5C3A5C9A4CEC4EAB5C1.html#a.a5.af.a5.e9.a5.b9.a5.e1.a5.bd.a5.c3.a5.c9.a4.ce.c4.ea.b5.c1
- 409 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:13:44 ]
- >>407
すごい大雑把に説明すると、 クラスは鯛焼きプレートでインスタンスは鯛焼き。 def self.foo と定義したものはクラスメソッド。 def bar と定義したものはインスタンスメソッド。 インスタンスメソッドはインスタンスがないと (Hoge.new しないと) 実行できない。 クラスメソッドはクラスが定義されていれば実行できる。インスタンスは不要。 インスタンスメソッドからクラスメソッドを呼ぶのは可能。 def bar self.class.foo end クラスメソッドからインスタンスメソッドを呼ぶには new しないとだめ。 あちこちに self が出てきて分からなくなってきたら p self として確認すればいいんじゃね。
- 410 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:02:25 ]
- PHPのGDに相当するRubyライブラリって何でしょうか?
円や直線など基本的な描画に加えて日本語の出力を行いたいです d.hatena.ne.jp/koki-h/20060822/p1 2年前の記事なのですが、現在は何か決定版があるのでしょうか?
- 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のクラスとインスタンスとメソッドを理解したいのか オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか どっちかにして欲しい 後者ならスレ違いだ
|

|