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"
…実はもっとブリリアントな記法があるのかも知れませんが