_
をつかって関数の部分適用ができる
a = _.neg; // a = { |x| x.neg }
a.value(10) // -10
a = _ + _; // a = { |x, y| x + y }
a.value(10, 20); // 30
a = _ + _ * _; // a = { |x| { |x, y| x + y } * x }
a.value(10, 20, 30); // BinaryOpFunction
a.value(10, 20).value(30); // ERROR [= (30 + nil) * 10 ]
a.value(10).value(20, 30); // 500 [= (20 + 30) * 10 ]
a = [ _, _, _, _ ]; // a = { |a, b, c, d| [ a, b, c, d ] }
a.value(1, 2, 3, 4); // [ 1, 2, 3, 4 ]
a = (a:_, b:_); // a = { |a, b| ( a: a, b: b ) }
a.value(1, 2); // ('a': 1, 'b', 2)
a = 10.clip(_, _); // a = { |x, y| 10.clip(x, y) }
a.value(15, 20); // 15
a = 10.clip(*_); // a = { |x| 10.clip(*x) }
a.value( 15, 20 ); // ERROR [= 10.clip(15, nil) ]
a.value([15, 20]); // 15 [= 10.clip(15, 20) ]
a = _.clip(*_); // a = { |x, y| x.clip(*y) }
a.value(16, [ 15, 20 ]); // 16 [= 16.clip(15, 20) ]
a = neg(_); // a = { |x| x.neg }
a.value(10) // -10
a = neg(*_); // a = { |x| x.neg }
a.value(10) // -10
a = _.max(_ + _); // a = { |x| x.max({ |x, y| x + y } }
a.value(50).value(10, 20); // 50 [= 50.max(10 + 20) ]