-
Notifications
You must be signed in to change notification settings - Fork 8
議事録(5)
tarya edited this page Jul 19, 2011
·
10 revisions
- 日付:2011年7月13日
- 議事録担当:@taryaさん , @sasakiさん
- AGENDAの共有(by司会)
- 前回決めたTryの再確認
- 過去の未解決質問を検討する時間があってもいいかもしれない
- コードを事前に用意してほしい
- 議事録を二人以上で書いてみる
- 一回は発言する
- 初参加者の自己紹介
- メタプログラミングRuby読書会
- 発表
- @mackatoさん「浜松Rails3道場 Active Record編(多分)」
- @kiwofusiさん「Rails勉強会とかAsakusa.rbみてきた話とかを5分でおしゃべりします」
- KPT(最後の15分)
- 次回の予告と担当割り振り
- @w1mvy 松本さん (@sea_mountain さんのご学友)
- メタプログラミングを勉強していきたい
-
p.145 コラム ・@@vが定義されているときのカレントクラスはObject ・クラス変数はサブクラスからアクセス可・ゆえにMyClassからObjectの@@vにアクセスできる、というのは理解できたのですが、「クラス変数はクラスではなく、クラス階層に属している」の意味がわかりませんでした(suchi)
- クラス変数は、定義されたクラスを派生したクラスでも参照できるし変更できる。ここで「クラス階層に属している」という表現を使っているのは、クラスインスタンス変数とは違うということを言いたいのではないかと思われる。
- クラスインスタンス変数: 定義されたそのクラスでしか参照できない
- クラス変数: 定義されたクラスを派生したクラスでも参照できる
- クラス変数は、定義されたクラスを派生したクラスでも参照できるし変更できる。ここで「クラス階層に属している」という表現を使っているのは、クラスインスタンス変数とは違うということを言いたいのではないかと思われる。
-
p.147 真ん中あたり「class_eval()...を使って、プライベートな @time_class 変数にこのクラスを割り当てる」のclass_evalを使った場合はどう書く?(mackato)
- class_eval と instance_eval の違いは?
- どちらも同じ動作をするようだが、オブジェクトに対しては instance_eval しか使えない
- Loan をオブジェクトとしての視点で見るときは、instance_eval を使い、クラスの視点で見るとき(オープンクラスを使いたいとき)は class_eval を使う
class Loan def initialize(book) @book = book @time = Loan.time_class.now end def self.time_class @time || Time end def to_s '#{@book.upcase} loaned on #{@time}' end end class FakeTime def self.now; 'Mon Apr 06 12:15:50'; end end require 'test/unit' class TestLoan < Test::Unit::TestCase def test_conversion_to_string Loan.class_eval { @tine_class = FakeTime } Loan = Loan.new('War and Peace') assert_equal 'WAR AND PEACE loaned on Mon Apr 06 12:15:50', loan.to_s end end
ここで、class_eval を instance_eval に書き換えても、そのまま動く
-
p.150 Object.singleton_methods #=> 特異メソッドを配列で返す
-
p.153 class_definisions/attr.rbのコードで、def my_attribute=(value)の部分で、my_attributeに=が付いている理由(これで起こる処理?)。
- "my_attribute=" までがメソッド名
- オブジェクトの属性に対する代入が目的のメソッド名は = を使う。(C# のプロパティの setter と同じで = がメソッド名に付く)
例として、以下のようなメソッド定義では、d.foo = "hoge" というように = を使うことができない。
class D def foo(value) @foo = value end end
-
p.158 「特異クラスとinstance_eval()」 「instance_evalを呼ぶことでカレントクラスをレシーバの特異クラスに変更する」の意味がわからなかった(suchi)
- 普通はその方法では使わないと言う事を主張するための文意があるのだろうか
- instance_eval もカレントクラスを変更するのだが、一般的にその目的で使うことはない。
- よって、instance_eval の意味として「self に変更を加えたい」という認識で問題ない
-
「4.6 エイリアス」 aliasとModule#alias_method() の使い分けは必要? (suchi)
- 別にわざわざ用意されている意味は何だろうか?
- 動的にエイリアスを作りたいときは、キーワードを使えないので Module#alias_method() が用意されている
-
4.7 クイズ:壊れた計算
- 演算子のオーバーライド
-
- というメソッドを自分で定義するとどうなるだろうか
class Foo def +(value) puts value; value end end Foo.new + "hello" => hello Foo.new + "hello" + " world" => hello world
- 再定義できない演算子
= ?: .. ... ! not && and || or ::
- 演算の優先度を変更できないだろうか
- => できなそう
- groovy のエルビス演算子(?:)は定義できるだろうか
- => ? が再定義できない為無理
- 告知(ATNDとか):
- モデレータ:
- 議事禄er:
- (勉強会終了後のフィードバック記事)