[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/16 20:58 / Filesize : 261 KB / Number-of Response : 970
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 19



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


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のクラスとインスタンスとメソッドを理解したいのか
オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか
どっちかにして欲しい
後者ならスレ違いだ

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もやっとくべきだと思いつつまだ入門もしてないだよなー。








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<261KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef