その他
    ホーム 技術発信 DoRuby irb 上で using の動作を試したときのメモ

    irb 上で using の動作を試したときのメモ

    この記事はアピリッツの技術ブログ「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 を使用後に同行にて変更が反映される様でした。