Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

instance_evalで似たメソッドをまとめる

instance_evalにブロックとしてメソッドをわたすと、上から順繰りに実行して
あたかもメソッドチェインかのように振舞います。

ただし、連続して実行するだけなので

"1234-5678-9123-4567".instance_exec do
  sub(/\d+/,'*' * 4)  
  sub(/\d+/,'*' * 4)  
  sub(/\d+/,'*' * 4)  
end

"1234-5678-9123-4567".sub(/\d+/,'*' * 4) 
"1234-5678-9123-4567".sub(/\d+/,'*' * 4) 
"1234-5678-9123-4567".sub(/\d+/,'*' * 4) 

とほぼ同じ意味です。
連続して実行したい場合は破壊的記述にするか、

str = "1234-5678-9123-4567"
str.dup.instance_eval do
   (1..3).each do |i| p sub!(/\d+/,"*" * i ) end  
   self
end

# "*-5678-9123-4567"
# "*-**-9123-4567"
# "*-**-***-4567"
#=> "*-**-***-4567"

あるいは内部でメソッドチェインをしてあげます。

str.dup.instance_eval do
  sub(/\d+/,"*" * 4 ).sub(/\d+/,"*" * 4 ).sub(/\d+/,"*" * 4 )
end
#=>"****-****-****-4567"

…実はもっとブリリアントな記法があるのかも知れませんが