最近「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)
- 作者: Paolo Perrotta
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2014/08/18
- メディア: ペーパーバック
- この商品を含むブログを見る