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