1
2

環境

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メソッドを使った場合と使わない場合とのコードの違いを比較してみました。

sample.rb
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ファイルはこのように作成されます。

無題.png

解説

上部の記述がinstance_execメソッドを利用しない場合の書き方で、下部の記述がinstance_execメソッドを利用した場合の書き方です。

どうでしょうか?。instance_execメソッドを使うと、rsというオブジェクト変数が省略できます。また、ブロック化できることで、整理された印象となり、見た目が分かりやすくなりました。そして、気になるのが、どっちの書き方の方が早いのかということですが、そこは分かりません。悪しからず。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2