目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
インスタンスメソッドを特定の場面のみ変更したい場合に using と refine を使う方法があります。irb 上でなかなか思った通りに動かなかったのでメモしておきます。
■ 参考 (instance method Module#refine)
http://docs.ruby-lang.org/ja/2.0.0/method/Module/i/refine.html
■ 環境
OS (sw_vers ; uname -a)
ProductName: Mac OS X
ProductVersion: 10.11.3
BuildVersion: 15D21
Darwin pomme.local 15.3.0 Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64 x86_64
ruby (ruby -v; irb -v ; pry -v)
ruby 2.1.9p441 (2015-12-23 revision 53262) [x86_64-darwin15.0]
irb 0.9.6(09/06/30)
Pry version 0.10.3 on Ruby 2.1.9
■ 使ってみました。
変更されるクラス (Enterprise) の定義
pomme:~ kadosaway$ pry
[1] pry(main)> class Enterprise
[1] pry(main)* def earn
[1] pry(main)* puts "much!"
[1] pry(main)* end
[1] pry(main)* end
=> :earn
変更を加えるモジュール (Strategist) の定義
[2] pry(main)> module Strategist
[2] pry(main)* refine Enterprise do
[2] pry(main)* def earn
[2] pry(main)* puts 'more!!!'
[2] pry(main)* end
[2] pry(main)* end
[2] pry(main)* end
=> #<refinement:enterprise @strategist>
変更前の動作確認
[3] pry(main)> prj = Enterprise.new
=> #<enterprise:0x007fc5788456d0>
[4] pry(main)> prj.earn
much!
=> nil
変更を using によって適用しての動作確認のつもり
[5] pry(main)> using Strategist
=> main
[6] pry(main)> prj = Enterprise.new
=> #<enterprise:0x007fc57909ca90>
[7] pry(main)> prj.earn
much!
=> nil
irb (pry)上では期待した通りにならない!?
命令を1行にして実行してみると
[8] pry(main)> using Strategist; prj = Enterprise.new; prj.earn
more!!!
=> nil
期待通りになりました。
同じメソッドを再度呼んでみると
[9] pry(main)> prj.earn
much!
=> nil
変更が解除されている。
試しに
[10] pry(main)> using Strategist; prj.earn; prj.earn
more!!!
more!!!
=> nil
[11] pry(main)> using Strategist; prj.earn; \
[11] pry(main)* prj.earn
more!!!
more!!!
=> nil
[12] pry(main)> prj.earn; prj.earn; using Strategist; prj.earn
much!
much!
more!!!
=> nil
using を使用後に同行にて変更が反映される様でした。