2020-07-09

# こんな経験はありませんか?
ary.map(&:m1).map(&:m2).map(&:m3)

ary.map(&:m1 >> :m2 >> :m3) # って書きたくないですか?

Ruby 2.6 で Proc#>> が追加され、2つの proc を合体させることができるようになりました。
そこで、RGSS3 にも移植しちゃいます。


class Proc
def >>(callable)
proc {|obj, *args| callable.call(call(obj, *args)) }
end
end
これで、proc を繋げることができるようになりました。

試して見ましょう。

class WordScanner
def self.call(str)
str.scan(/\w+/)
end
end
f = proc {" Hello, World!\n Hello, Ruby!" } >> WordScanner >> method(:p)
f.call # => ["Hello", "World", "Hello", "Ruby"]
このように call メソッドが定義されているオブジェクトなら繋ぐことができます。

しかし、目的は map で使うことなので、Symbol で繋げられるようにします。

class Symbol
def >>(callable)
to_proc >> callable.to_proc
end
def call(obj, *args)
to_proc.call(obj, *args)
end
end


p %w[9, 99, 999].map(&:to_i >> :next >> :to_s >> :size >> -> x { "#{x}桁" })
# => ["2桁", "3桁", "4桁"]
(o'∀')ノ できたー


でも : とか >> も面倒ですか?
配列に Proc を合成するメソッドを追加します。
RGSS3 には、シンボル配列を作る機能(%i)がないため、文字列にも追加します。

class Array
def to_proc
inject {|r,m| r.to_proc >> m }
end
end
class String
def to_proc
to_sym.to_proc
end
def call(obj, *args)
to_proc.call(obj, *args)
end
end


p [:acd, :bjid, :ce].map(&%w[to_s chars to_a first upcase])
# => ["A", "B", "C"]
₍₍ (ง ˙ω˙)ว ⁾⁾ いいよー


最後に、元々 Proc#>> は call に依存する実装ですが、多くは to_proc と call の2つの定義が必要になっているので、to_proc に依存しても良いかもしれませんね。

class Proc
def >>(callable)
proc {|obj, *args| callable.to_proc.call(call(obj, *args)) }
end
end
その場合の WordScanner はこうかな?

class WordScanner
def self.to_proc
proc {|str| str.scan(/\w+/) }
end
end


最終的には、このようになりました。

# proc 合成のための定義 (to_proc が定義されたオブジェクトは合成可能)
class Proc
def >>(callable)
proc {|obj, *args| callable.to_proc.call(call(obj, *args)) }
end
end
# シンボル同士から proc 合成するための定義
class Symbol
def >>(callable)
to_proc >> callable.to_proc
end
end
# 配列から proc 合成するための定義
class Array
def to_proc
inject {|r,m| r.to_proc >> m }
end
end
# 文字列から proc を生成するための定義
class String
def to_proc
to_sym.to_proc
end
end
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。



トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/807-75a6fdd1
≪ トップページ ≫
カレンダー
05 << 2021/06 >> 07
- - 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 30 - - -

カテゴリー
最近の記事
最近のコメント
タグクラウド

リンク