環境
Ruby2.6
はじめに
Rubyを触っていて、その昔、VBでよく使っていたWith...End With ステートメントが、Rubyでも使えないものだろうかと思いググってみました。
Rubyではどうも、instance_execメソッドを使って実現できるらしいです。
VBのWith...End With ステートメントは個人的には、わりと重宝して使っていたにも関わらず、Rubyのinstance_execメソッドについて書かれた記事はあまり散見されないようです。
instance_execメソッドの便利さはあまり認知されていないのだろうか。そこで、instance_execメソッドの便利さについて書いてみました。
メリット
instance_execメソッドを使うと、オブジェクト参照を複数行に渡って記述したいときに、反復した記述を省略することができます。そのことによって、コードの見映えをよくすることができます。
サンプル
RubyXLというgemを使って、Excelファイルを新規に作成して書き込みをするサンプルコードです。こちらのコードを使って、instance_execメソッドを使った場合と使わない場合とのコードの違いを比較してみました。
require 'rubyXL'
require 'rubyXL/convenience_methods'
book = RubyXL::Workbook.new
sheet = book[0]
# instance_execメソッドを利用しない場合
rs = sheet.add_cell(0, 0, '2024/03/01')
rs.set_number_format('yyyy/mm/dd')
rs.change_border(:bottom, 'hair')
rs.change_horizontal_alignment('center')
# instance_execメソッドを利用した場合
sheet.add_cell(1, 0, '2024/04/01').instance_exec {
set_number_format('yyyy/mm/dd')
change_border(:bottom, 'hair')
change_horizontal_alignment('center')
}
book.write('foo.xlsx')
コードを実行すると、Excelファイルはこのように作成されます。
解説
上部の記述がinstance_execメソッドを利用しない場合の書き方で、下部の記述がinstance_execメソッドを利用した場合の書き方です。
どうでしょうか?。instance_execメソッドを使うと、rsというオブジェクト変数が省略できます。また、ブロック化できることで、整理された印象となり、見た目が分かりやすくなりました。そして、気になるのが、どっちの書き方の方が早いのかということですが、そこは分かりません。悪しからず。