Issue #8088 has been updated by marcandre (Marc-Andre Lafortune).


headius (Charles Nutter) wrote:
> I was contemplating hacking something together myself, in fact. Would like to see what you're proposing...can you add an issue to CommonRuby?

I could, or maybe you and I can work on something together before submitting it?

> So I suppose you're thinking about something more like this for MRI?
> 
> rb_define_method_x(rb_cString, "gsub", rb_str_gsub, 1 /*req*/, 1 /*opt*/, 0 /*rest*/)

Kind of. 

My goals would be to be able to, at least:
- know the minimum and maximum arity (where max can be unlimited). See #5747
- know list of optional and mandatory keyword arguments, presence of keyrest. See #6086
- know if a block can be passed. See #7299

It should also be possible to name the arguments.

This would allow any `method(:built_in).parameters` to return just about anything we want, like for a Ruby method.

I'm thinking of having something like:

  rb_define_method_x(rb_cString, "gsub", rb_str_gsub, "pattern, [replacement], [&]");

Although a string means some form of parsing, it also makes the API extensible as well as expressive. In any case, a string is required for named parameters.

Actually, we could even reuse rb_define_method, e.g.:

  rb_define_method_x(rb_cString, "gsub(pattern, [replacement], [&])", rb_str_gsub, 0);

> It would be super nice if it's possible to get actual C parameters, but I don't think you can do that programmatically (i.e. they'd have to be passed in).

Sorry, not sure what you mean.
----------------------------------------
Feature #8088: Method#parameters (and friends) should provide useful information about core methods
https://bugs.ruby-lang.org/issues/8088#change-37612

Author: headius (Charles Nutter)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


I was wiring up #parameters to work for native methods today when I realized MRI doesn't give very good information about variable-arity native methods:

ext-jruby-local ~/projects/jruby $ ruby2.0.0 -e "p ''.method(:gsub).to_proc.parameters"
[[:rest]]

ext-jruby-local ~/projects/jruby $ jruby -e "p ''.method(:gsub).to_proc.parameters"
[[:req], [:opt]]

I think MRI should present the same as JRuby here; gsub is obviously not a rest-arg method and you can't call it with less than 1 or more than 2 arguments. JRuby's presenting the right output here.

I'm probably going to have to change JRuby to do the less-helpful version so we're compliant and tests pass, but I think the specification of #parameters should be that it presents the JRuby version about rather than the MRI version.


-- 
http://bugs.ruby-lang.org/