9
9

More than 5 years have passed since last update.

Ruby で中置関数

Last updated at Posted at 2012-07-13

Haskell では,関数を中置する文法が用意されています.

5 `mod` 2 -- 1
[1,2,3] `isPrefixOf` [1,2,3,4] -- True

Ruby でも関数をうまく中置できないか考えました.
かなりネタですが,次のようにするとそれっぽくなります.`` 不要です.

# 右辺の値を受け取って,左辺の値を受け取り結果を返すメソッドを定義
def is_prefix_of(rhs)
    lambda do |lhs|
        lhs.zip(rhs).reject{|a,b| a.nil?}.all?{|a,b| a==b}
    end
end

def elem(rhs)
    lambda{|lhs| rhs.include? lhs}
end

a1 = 1,2,3
a2 = 1,2,3,4,5,6
n = 10

# a1 を知るためにブロックで外の変数を取り込む
self.define_singleton_method(:method_missing) do |name,*args|
    args.first.call eval name.to_s
end

# is_prefix_of を中置!
a1 is_prefix_of a2 #=> true

# 左辺が右辺に含まれているかを示す elem も中置!
n elem [2,4,6,8] #=> false

これはまず is_prefix_of a2a2 だけを部分適用した Proc オブジェクトが返され,a1 が呼ばれて,a1 は実際には存在しないメソッドなので method_missing に呼び出しが渡され,そこで実際の処理が行われるという流れです.
method_missing の定義内で a1 を知っていないといけないのと,そもそもリテラルが左辺に来てはいけないので実用性は無いですが,中置格好良いです.

9
9
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
9
9