読者です 読者をやめる 読者になる 読者になる

Singleton Methods と Class Macros

Ruby

最近「Metaprogramming Ruby 2: Program Like the Ruby Pros (Facets of Ruby)」を読んでて,Part 1. Metaprogramming Ruby まで読み終えることを4月の目標にしてる.洋書で読んでるってこともあって全然進んでないけど頑張る!

P114. Introducing Singleton Methods

日本語だと「特異メソッド」って呼ぶ.

String クラスにメソッドを追加する「オープンクラス」とは異なり,この例で言うと paragraph っていう String オブジェクトに限定してメソッドを追加している.影響を最小限に抑えられる.

paragraph = 'any string can be a paragraph'

def paragraph.title?
  self.upcase == self
end

methods で確認するとちゃんと paragraphメソッドが追加されてることがわかる.

p paragraph.methods.grep(/title?/)
p String.methods.grep(/title?/)
# >> [:title?]
# >> []

今度は P85 で勉強した instance_eval を使ってメソッドを追加してみた.

paragraph.instance_eval do
  def body?
    self.downcase == self
  end
end

p paragraph.methods.grep(/title?|body?/)
# >> [:title?, :body?]

P116. Class Macros

よく使う attr_* の紹介として,それを実際に再現したコードが紹介されていた.

class MyClass
  def my_attribute=(value)
    @my_attribute = value
  end
  def my_attribute
    @my_attribute
  end
end

obj = MyClass.new
obj.my_attribute = 'x'
p obj.my_attribute
# >> "x"

method=() の記法は知らなかった!こう宣言すると代入専用 (setter) としてメソッドを定義できる.実際に読み出そうとすると undefined method になった.なるほど!

class MyClass
  def my_attribute=(value)
    @my_attribute = value
  end
end

obj = MyClass.new
obj.my_attribute = 'x'
p obj.my_attribute
# ~> -:9:in `<main>': undefined method `my_attribute' for #<MyClass:0x007fca689fe4c8 @my_attribute="x"> (NoMethodError)

ちなみに

値表示するのは xmpfilter を使った.

メタプロ頑張るぞ!

読み終えるにはまだまだ先が長いけど頑張るぞ!

Metaprogramming Ruby 2: Program Like the Ruby Pros (Facets of Ruby)

Metaprogramming Ruby 2: Program Like the Ruby Pros (Facets of Ruby)

関連エントリー