Tbpgr Blog

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

Ruby | 配列の各要素に対してメソッドを実行するための簡易記法を作ってみた

概要

配列の各要素に対してメソッドを実行するための簡易記法を作ってみた

詳細

配列の各要素に対してメソッドを実行するための簡易記法を作ってみました。
この手の操作は利用頻度が高いので短く書きたいと思ったのがきっかけです。

tbpgr_utilsという自作ユーティリティgemに実装してあるので試したい場合は

gem i tbpgr_utils

が必要です。

下記の呼び出しで、配列の各要素に対してメソッドを実行した結果配列を取得します。

["配列"].>>.メソッド名(メソッドの引数)

※引数なしの場合

["配列"].>>.メソッド名

要は下記と同じ

["配列"].map { |v|v.メソッド名(メソッドの引数)}

※引数なしの場合

["配列"].map (&:メソッド名)

実装内容が気になる方は下記を参照
https://github.com/tbpgr/tbpgr_utils/blob/master/lib/open_classes/array/gte_gte.rb

サンプルコード

require 'tbpgr_utils'

# ['a', 'b', 'c']の各要素をASCIIコードに変換して、コード値を2増加、文字列に戻す
## 従来の記法
print [*'a'..'c'].map(&:ord).map{ |v|v + 2 }.map(&:chr)
puts
## 簡易記法
print [*'a'..'c'].>>.ord.>>.+(2).>>.chr
puts

# 数値配列[65, 66, 67, 68]の各要素に3を加算し、合計する
## 従来の記法
print [*65..68].map { |v|v + 3 }.reduce(&:+)
puts
## 簡易記法
print [*65..68].>>.+(3).reduce(&:+)
puts

# >>は何を返却しているのか?
tmp = [*65..68].>>
puts tmp
print tmp.receiver, "\n"

__END__
Array#>>メソッドはArrayContextという自作クラスを返却しています。
ArrayContextはインスタンス変数として配列の値をreceiverとして保持しています。
ArrayContextに対してメソッドの呼び出しを行うと、method_missing内で
receiverの各要素に対してメソッドを呼び出した結果を返却するようにしてあります。

出力

["c", "d", "e"]
["c", "d", "e"]
278
278
#<ArrayContext:0x2639058>
[65, 66, 67, 68]