Feature #6284 » 0002-proc.c-Implement-Method-for-Method-composition.patch
proc.c | ||
---|---|---|
return proc;
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* meth * g -> a_proc
|
||
*
|
||
* Returns a proc that is the composition of this method and the given proc <i>g</i>.
|
||
* The returned proc takes a variable number of arguments, calls <i>g</i> with them
|
||
* then calls this method with the result.
|
||
*
|
||
* def f(x)
|
||
* x * 2
|
||
* end
|
||
*
|
||
* f = self.method(:f)
|
||
* g = proc {|x, y| x + y }
|
||
* h = f * g
|
||
* p h.call(1, 2) #=> 6
|
||
*/
|
||
static VALUE
|
||
rb_method_compose(VALUE self, VALUE g)
|
||
{
|
||
VALUE proc = method_to_proc(self);
|
||
return proc_compose(proc, g);
|
||
}
|
||
/*
|
||
* Document-class: LocalJumpError
|
||
*
|
||
... | ... | |
rb_define_method(rb_cMethod, "clone", method_clone, 0);
|
||
rb_define_method(rb_cMethod, "call", rb_method_call, -1);
|
||
rb_define_method(rb_cMethod, "curry", rb_method_curry, -1);
|
||
rb_define_method(rb_cMethod, "*", rb_method_compose, 1);
|
||
rb_define_method(rb_cMethod, "[]", rb_method_call, -1);
|
||
rb_define_method(rb_cMethod, "arity", method_arity_m, 0);
|
||
rb_define_method(rb_cMethod, "inspect", method_inspect, 0);
|
test/ruby/test_method.rb | ||
---|---|---|
assert_equal('1', obj.foo(1))
|
||
assert_equal('1', obj.bar(1))
|
||
end
|
||
def test_compose_with_method
|
||
c = Class.new {
|
||
def f(x) x * 2 end
|
||
def g(x) x + 1 end
|
||
}
|
||
f = c.new.method(:f)
|
||
g = c.new.method(:g)
|
||
h = f * g
|
||
assert_equal(6, h.call(2))
|
||
end
|
||
def test_compose_with_proc
|
||
c = Class.new {
|
||
def f(x) x * 2 end
|
||
}
|
||
f = c.new.method(:f)
|
||
g = proc{|x| x + 1}
|
||
h = f * g
|
||
assert_equal(6, h.call(2))
|
||
end
|
||
def test_compose_with_nonproc_or_method
|
||
c = Class.new {
|
||
def f(x) x * 2 end
|
||
}
|
||
f = c.new.method(:f)
|
||
assert_raise(TypeError) {
|
||
f * 5
|
||
}
|
||
end
|
||
end
|