Torihaji's Growth Diary

Little by little, no hurry.

ruby初心者がoptparseを使ってみた結果

はじめに

みなさん、こんにちは。torihaziです。

ruby初めてようやく1週間くらいが経ったと思います。

今回は コマンドライン引数を受けとることができるライブラリ

optparseを使っていきたいと思います!

それでは ltg

optparse

コマンドライン引数を受け取ることができると書きました。

それはどのようなものかというと

ruby test.rb -a testのようにこの-a testの部分を受け取ることができると言うことです。

使い方

マニュアル

マニュアルにも記載がある通り、optparseの基本的な使い方は

  1. OptionParser オブジェクト opt を生成する。
  2. オプションを取り扱うブロックを opt に登録する。
  3. opt.parse(ARGV) でコマンドラインを実際に parse する。

になります。

1. OptionParser オブジェクトを生成する

require `optparse`
opt = OptionParser.new

この書き方は初心者の私であっても慣れてきました。

組み込みライブラリでない標準ライブラリを組み込むためのrequire

そこからOptionParserをオブジェクト化するためのnewです。

これにより変数optにOptionParserオブジェクトが代入されます。

2. オプションを取り扱うブロックをoptに登録する

require `optparse`
opt = OptionParser.new

# ここから #
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

ここではonメソッドを使用します。

onメソッドの書き方は

opt.on('オプションの設定', 入力値の型指定[Integerなど], '説明`・・)

オプションの設定は-aなどが基本です。

-aの後に何か必須で受け取りたいなら -a valとします。

任意で受け取りたい場合は -a [val]とします。([]は [のみでもいいです)

onメソッドによって入力値であるオプションが登録されます。

ここでは登録されるだけです。

ブロック内の処理を実行するには後述するparseをする必要があります。

嘘だと思う方は試しに実行してみてください。

下記は ruby main.rb -a test -b numとした実行結果です。何も出ません。

require 'optparse'
opt = OptionParser.new

opt.on('-a test') {|v| p v }
opt.on('-b num') {|v| p v }

# 出力結果
# なし

3.opt.parse(ARGV)でコマンドラインを実際にparseする

parseするとはどう言うことかというと解析して実行できるようになると言うことです。

これにより -a testの testが受け取ることができるようになります。

require `optparse`
opt = OptionParser.new

opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

# ここから #
opt.parse(ARGV)

# 引数を使うメイン処理の記載
puts ARGV

これを実行すると次のように帰ってきます。

# ruby Main.rb -a test -b num
"test"
"num"
["-a", "test", "-b", "num"]

そのため、引数を受け取り何か別の変数に代入するためには

ブロック内で処理を記述すれば良いことが分かります。

下記のように記述します。

require 'optparse'
opt = OptionParser.new
options = {}

opt.on('-a val') {|v| options[:a] = v}
opt.on('-b num') {|v| options[:b] = v}

opt.parse(ARGV)
p options

# 実行結果
#ruby Main.rb -a test -b num
# {:a=>"test", :b=>"num"}

以上の記述で、コマンドラインのオプションを解析して引数の値を受け取ることができるようになります。

まとめ

なんだかよくわからないと言う人は

  1. opt.onで引数を登録して
  2. opt.parseすれば
  3. その引数を使えるようになる

とだけでも理解しておいてください。

応用編

この度、カレンダーを作成してみました。

ご参考ください。

# frozen_string_literal: true

require 'optparse'
require 'date'

opt = OptionParser.new

options = { month: Date.today.month }

# 引数の受け取り
opt.on('-m [month]', Integer) {|month|
  if month >= 1 && month <= 12
    options[:month] = month
  else
    puts "#{month} is neither a month number (1..12) nor a name"
    exit
  end
}

begin
  opt.parse!(ARGV)
rescue ArgumentError => e
  puts 'Only integers between 1 and 12'
  exit
end

# データの用意
year = Date.today.year
header = Date.new(year, options[:month]).strftime('%-m月 %Y')
start_day = Date.new(year, options[:month], 1)
end_day = Date.new(year, options[:month], -1)
wdays = %w[月 火 水 木 金 土 日]
wday = start_day.wday

# カレンダー出力
puts header.center(20)
puts wdays.join(' ')
print '   ' * (start_day.wday - 1)

(1..end_day.day).each do |date|
  print format('%2s', date.to_s)
  print ' '
  puts '' if (wday % 7).zero?
  wday += 1
end

puts

実行結果は下記です。ターミナルではずれずに出ています。

root@1e049359c7de:/com/practice_ruby/practice_calendar# ruby calendar.rb -m 2
      2月 2024       
月 火 水 木 金 土 日
          1  2  3  4 
 5  6  7  8  9 10 11 
12 13 14 15 16 17 18 
19 20 21 22 23 24 25 
26 27 28 29 

終わりに

いかがだったでしょうか。

個人的に onでは登録しかされないと言うことが理解に苦しみました。

ただいろいろ触っていくうちに

だんだんと理解できるようになりました。

わからないことが多いことは辛いですが、

乗り越えれば楽しいことが増えます。

頑張ってください。

僕も頑張ります。