Skip to content
tarya edited this page Sep 20, 2011 · 11 revisions

[議事録]

  • 日付:2011年9月14日
  • 議事録担当:@y_murase、@ke_tachibanaさん

AGENDA

  1. AGENDAの共有(by司会)
  2. 前回決めたTryの再確認
  3. 初参加者の自己紹介
  4. メタプログラミングRuby読書会
  5. 発表
  6. その他
  7. KPT(最後の15分)
  8. 次回の予告と担当割り振り

範囲:第5章 金曜日: コードを記述するコード

疑問点と議論

  • inspectを使うのはなぜ?
    • eval の中に入れるので、inspect の方がよい
    • ダブルクォーテーションなどをRubyコードでそのまま使える文字列リテラルで展開してもらえる
  • セーブレベルが有効なのはProcの中だけ
    • Ruby文法の仕様
  • セーフレベルをカスタマイズできるのか?
    • ディスクのフォーマットだけを許可するようにするとか
    • 低レベルで実装してそうなので、できないような気がするが、Rubyだからできそうな気もする。
    • テストコードを見るとわかるかもしれない。
  • classは変数でクラス名は受け取れない
    • classは必ず定数しか受け取れない。というのが、文法の仕様
  • add_checkd_attributeのattributeという引数はシンボルでもOK?
    • #{}の中では、.to_s が呼ばれるので、シンボルを入れても大丈夫
  • evalが3種類あって混乱している
    • instance_eval
      • インスタンスをselfとして使うときに使う
      • ブロックを渡せる
    • class_eval
      • クラスをselfとして使うときに使う
      • ブロックを渡せる
    • eval
      • 文字列しか受け取れないので不便。最終手段。
      • ブロックを渡す方が、シンタックスチェックをしてもらえるのでセキュア

クイズ

発表

メタプログラミング事例の紹介(@kzgs)

以下のように、メソッド(mymethod)を定義すると、mixinすることも、単純にModuleメソッドとして実行することもできる。

module A
  class << self
    define_method(:mymethod) do |arg1, arg2, &block|
      ...
    end
  end
end

class B
  include A
end

B.new.mymethod

A.mymethod("a", "b") do |x|
  ...
end

このように、define_methodに指定するブロックに引数を指定できるのは、Ruby 1.8.7 以降。

Tips: ファイルの変更を監視して、実行するツール

ifchanged *.rb --d "./meta.sh"

議論がinstance_execの話に発展。

instance_execも引数付きブロックを受け取れるが、これもRuby1.8.7以降。

instance_exec(3) do |x|
  ...
end

instance_execの引数はどういうときに使うのか?

proc = lambda {|x| puts "lambda #{x}"}
instance.instane_exec(1, &proc)  # 1がユーザ入力とか動的に変わるもの

という感じ。

KPT

Keep

Problem

Try

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

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

フィードバック

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

Clone this wiki locally