Ruby 初心者スレッド Part 30
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/08/08(土) 08:21:23★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0975デフォルトの名無しさん
2009/09/16(水) 09:57:02def initialize
hoge
hoge = Array.new
hoge
end
def hoge
puts "参照メソッド呼ばれましたん"
end
def hoge=(arg)
puts "代入メソッド呼ばれましたん"
@hoge=arg
end
end
C.new
これはやっぱり
参照メソッド呼ばれましたん
代入メソッド呼ばれましたん
参照メソッド呼ばれましたん
であるべきなんじゃないかと思う今日この頃
っていうかこのへんの動作に依存したスクリプト作るのやめれ紛らわしいわぼけーうおー
0976デフォルトの名無しさん
2009/09/16(水) 10:01:110977デフォルトの名無しさん
2009/09/16(水) 10:30:57代入の形したメソッドがある場合はどっち使うのか注意
0978デフォルトの名無しさん
2009/09/16(水) 10:35:22決定されるのは自然な発想では
ただ確かに紛らわしいから、結局
>このへんの動作に依存したスクリプト作るのやめれ
じゃなかろうか
0979デフォルトの名無しさん
2009/09/16(水) 10:41:58hoge= というインスタンスメソッドがあっても、hoge=Array.new はローカル変数への代入だ
= つきのインスタンスメソッドを呼びたい場合はレシーバが必須になる
この場合は self をつけて self.hoge=Array.new だな
これに def hoge; @hogeを処理して返す; end が加わってると混迷を増す
0980デフォルトの名無しさん
2009/09/16(水) 12:00:210981デフォルトの名無しさん
2009/09/16(水) 13:23:01呼び出しはそれでいいんだけど、>>977も言うようにキモは代入でしょ
ローカル変数とインスタンスメソッドに同じ名前さえ付けなければ
この手の問題は起きないと思ってる人はわりといるはず、つーか俺
>>980
存在するローカル変数と存在するインスタンスメソッドなら同意
まだ存在しないローカル変数と存在するインスタンスメソッドだったら、存在する方が優先に思える
「代入もメソッド呼び出しである」と考えると
変数hogeがないときにself.hogeが呼ばれる動作と対称的ではないのが違和感の原因
「疑わしきはローカル変数と見なす」も理解はできるけどね
0982デフォルトの名無しさん
2009/09/16(水) 13:57:45それは仕方ない。そういうもんです、慣れてくださいとお願いするしかない。
ただまあ、代入に関して言えば、
・foo = 123 は変数への代入
・obj.foo = 123 は setter メソッドの呼び出し
というルールが分かっていれば、そう混乱することはないように思う。
問題は、それを明確に教えていない本やドキュメントのほう。
0983デフォルトの名無しさん
2009/09/16(水) 14:06:39hoge というインスタンスメソッドが定義されているとき、 hoge(123) とすると hoge メソッドに 123 が渡される
hoge! というインスタンスメソッドが定義されているとき、 hoge!(123) とすると hoge! メソッドに 123 が渡される
hoge? というインスタンスメソッドが定義されているとき、 hoge?(123) とすると hoge? メソッドに 123 が渡される
[] というインスタンスメソッドが定義されているとき、 [](123) とすると [] メソッドに 123 が渡される
[]= というインスタンスメソッドが定義されているとき、 []=(123) とすると []= メソッドに 123 が渡される
とここまで来ておきながら
hoge= というインスタンスメソッドが定義されているとき、 hoge=(123) とするとローカル変数 hoge に 123 が代入される
になること
0984デフォルトの名無しさん
2009/09/16(水) 14:38:32ただ、それは
・代入のほうが優先される
というルールで簡単に説明できるんじゃね?
これなら十分わかりやすい。
0985デフォルトの名無しさん
2009/09/16(水) 15:58:470986デフォルトの名無しさん
2009/09/16(水) 16:02:120987デフォルトの名無しさん
2009/09/16(水) 16:17:07インスタンス変数が@var
なんだから
ローカル変数にも命名規約を作ればよかっただけ
#varとか
設計者の脳みそが足りなかった
0988デフォルトの名無しさん
2009/09/16(水) 16:18:50・ obj.hoge = や obj.hoge= とあったとき、それは必ず obj のメソッド hoge=() である
・ hoge = や hoge= とあったとき、それは必ず変数 hoge への代入である
・ 末尾に = がついたメソッドはいわゆる関数形式では呼べないので諦めろ
こう覚える
0989デフォルトの名無しさん
2009/09/16(水) 17:00:320990デフォルトの名無しさん
2009/09/16(水) 17:14:110991デフォルトの名無しさん
2009/09/16(水) 17:57:10ふだん書いてて使いやすいように、一貫したルールが必要なんだろ
マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ
0992デフォルトの名無しさん
2009/09/16(水) 18:25:45Perl の $ と @ が脳裏をよぎったw
0993デフォルトの名無しさん
2009/09/16(水) 18:31:030994デフォルトの名無しさん
2009/09/16(水) 18:55:03アンチさんたちは何が不満なのかな。
0995デフォルトの名無しさん
2009/09/16(水) 19:24:17アンチってどれよ
0996デフォルトの名無しさん
2009/09/16(水) 20:57:580997デフォルトの名無しさん
2009/09/16(水) 21:01:300998デフォルトの名無しさん
2009/09/16(水) 23:18:440999デフォルトの名無しさん
2009/09/16(水) 23:19:591000デフォルトの名無しさん
2009/09/16(水) 23:21:3510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。