Skip to content
tarya edited this page Jul 19, 2011 · 10 revisions

[議事録]

  • 日付:2011年7月13日
  • 議事録担当:@taryaさん , @sasakiさん

AGENDA

  1. AGENDAの共有(by司会)
  2. 前回決めたTryの再確認
  • 過去の未解決質問を検討する時間があってもいいかもしれない
  • コードを事前に用意してほしい
  • 議事録を二人以上で書いてみる
  • 一回は発言する
  1. 初参加者の自己紹介
  2. メタプログラミングRuby読書会
  3. 発表
  • @mackatoさん「浜松Rails3道場 Active Record編(多分)」
  • @kiwofusiさん「Rails勉強会とかAsakusa.rbみてきた話とかを5分でおしゃべりします」
  1. KPT(最後の15分)
  2. 次回の予告と担当割り振り

初参加

  • @w1mvy 松本さん (@sea_mountain さんのご学友)
    • メタプログラミングを勉強していきたい

範囲:第4章 木曜日: クラス定義

疑問点と議論

  • 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 のエルビス演算子(?:)は定義できるだろうか
    • => ? が再定義できない為無理

クイズ

発表「○○」

KPT

Keep

Problem

Try

次回の予告と担当割り振り

  • 告知(ATNDとか):
  • モデレータ:
  • 議事禄er:

フィードバック

  • (勉強会終了後のフィードバック記事)
Clone this wiki locally