Ruby - Object#self があればちょっとうれしい - Qiita
の派生ネタ。
名前だけ関連していますが、内容は脱線していますw
self gem
というのがありますw
これは
class Object
def self
self
end
end
では ありません w
紹介
簡単に言うと、インスタンス変数やプライベートメソッドへのアクセスを簡単に行うためのメソッドを作ってくれるメソッドです。インスタンス変数への代入メソッドも作ってくれます。
インストール
-
pry
で使う場合
$ gem install pry-self
pry
実行時に自動的に self gem を require
してくれます。
-
pry
を使わない場合
$ gem install self
例
GitHub の例を実現する Class を書いてみました。
class Mouse
class Head; end
class Tail; end
class Legs; end
def initialize
@head = Head.new
@tail = Tail.new
@legs = Legs.new
end
private
def squeak!
"Squeak!"
end
end
この Mouse
クラスのインスタンスメソッド mouse
で Object#self
メソッドの働きを確認しましょう。 pry
を使います。
pry
の ls
メソッドは、 -p
オプションが(プライベートメソッドを含む)全てのメソッドを表示し、 -i
オプションがインスタンス変数及びクラス変数を表示します。
[1] pry(main)> mouse = Mouse.new
#=> #<Mouse:0x007fe83e25d810 @head=#<Mouse::Head:0x007fe83e25d770>, @legs=#<Mouse::Legs:0x007fe83e25d680>, @tail=#<Mouse::Tail:0x007fe83e25d748>>
[2] pry(main)> ls -pi mouse
Mouse#methods: initialize squeak!
instance variables: @head @legs @tail
-
Object#self
のあとにインスタンス変数名のメソッドを呼ぶとインスタンス変数が返ります。
[3] pry(main)> mouse.self.head
#=> #<Mouse::Head:0x007fe83e25d770>
[4] pry(main)> mouse.head
NoMethodError: undefined method `head' for #<Mouse:0x007fe83e25d810>
-
Object#self
のあとにはプライベートメソッドを呼べます。
[5] pry(main)> mouse.self.squeak!
#=> "Squeak!"
[6] pry(main)> mouse.squeak!
NoMethodError: private method `squeak!' called for #<Mouse:0x007fe83e25d810>
- インスタンス変数への代入メソッドも作ってくれます。
[7] pry(main)> mouse.self.tail
#=> #<Mouse::Tail:0x007fe83e25d748>
[8] pry(main)> mouse.self.tail = "long tail"
#=> "long tail"
[9] pry(main)> mouse
#=> #<Mouse:0x007fe83e25d810 @head=#<Mouse::Head:0x007fe83e25d770>, @legs=#<Mouse::Legs:0x007fe83e25d680>, @tail="long tail">
[10] pry(main)> mouse.self.tail
#=> "long tail"
注意
この gem はテストだけに使いましょう。