Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | 可変長のリストとオプション(ハッシュ)の引数を共存させる場合

概要

可変長のリストとオプション(ハッシュ)の引数を共存させる場合

詳細

可変長のリストとオプション(ハッシュ)の引数を共存させる場合について。
ActiveSupportdelegateメソッドを呼んでいて、このパターンのコードがあったのでまとめます。
delegateメソッドでの利用例はoptionsに少なくとも1つの値があることを前提としていましたが
この記事のサンプルはオプションが指定されなかった場合も考慮します。

サンプル

# encoding: utf-8
require 'tbpgr_utils'

def some_method(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  message = args.join
  message += options[:語尾] if options[:語尾]
  message = "#{options[:装飾]}#{message}#{options[:装飾]}" if options[:装飾]
  message
end

bulk_puts_eval binding, <<-EOS
some_method "今日は", "とても", "いい天気", 語尾: 'どすえ'
some_method "今日は", "とても", "いい天気", 語尾: 'っすね', 装飾: '★'
some_method "今日は", "とても", "いい天気"
some_method "今日は", "とても", "いい天気", 装飾: '☆'
EOS

__END__
下記はTbpgrUtils gemの機能

bulk_puts_eval

詳しくは下記参照
https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils

出力

some_method "今日は", "とても", "いい天気", 語尾: 'どすえ' # => "今日はとてもいい天気どすえ"
some_method "今日は", "とても", "いい天気", 語尾: 'っすね', 装飾: '★' # => "★ 今日はとてもいい天気っすね★"
some_method "今日は", "とても", "いい天気" # => "今日はとてもいい天気"
some_method "今日は", "とても", "いい天気", 装飾: '☆' # => "☆今日はとてもいい天気☆"