ホーム 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 を使用後に同行にて変更が反映される様でした。

記事を共有

最近人気な記事