"I decided not to introduce full refinement for Ruby 2.0."
bugs.ruby-lang.org
bugs.ruby-lang.org
Issue #4085 has been updated by matz (Yukihiro Matsumoto).
Since there still remain undefined corner case behavior in refinements,
and the time is running out, I decided not to introduce full refinement
for Ruby 2.0. The limited Ruby 2.0 refinement spec will be:
* refinements are file scope
* only top-level "using" is available
* no module scope refinement
* no refinement inheritance
* module_eval do not introduce refinement (even for string args)
In addition, Module#include should add refinements to included modules,
e.g.
module R1
refine String do
def bar
p :bar
end
end
end
module R2
include R1
refine String do
def foo
p :foo
end
end
end
using R2
"".foo
"".bar
module R1
refine String do
def bar; p :bar end
end
end
module R2
include R1
refine String do
def foo; p :foo end
end
end
using R2
"".foo
"".bar # does not work now
You can treat top-level "using" as soft-keyword, as long as it does not
change the behavior (but performance).
Matz.I think, they should just leave it out (at least for now) and rather spend some more time on performance, stabilty and memory usage in MRI...
This is how generally new things to python are introduced: http://www.python.org/dev/peps/
module Foo
def hello
puts "Hello World"
end
end
...in a different file...
foo = Foo.new.msg
Q: What does that print?
A: There is no way to tell. It depends on what the 'using' line (not shown) is, and whether anything has refined 'Foo'.Seems like bad action at a distance, to me. Or am I missing something? The example about the effects of refining 'each' is also pretty disconcerting.
You can't initialize modules, I think you meant to make Foo a class.
Matz, Shugo, and Charlie will figure it out soon enough, but it is interesting. What is more upsetting to me really is the version number. 2.0 implies some major changes, but 1.9 was more major. It should be 1.10, and then they should work on something more revolutionary for 2.
There is a lot of pressure on Matz also. They really need to spend more time on it.
I'm not sure about 'last minute,' but yes, 3.1 was a big jump. Rails doesn't follow SemVer, neither does Ruby.
> They really need to spend more time on it.
This is absolutely true, and is my biggest complaint.
using R2
"".foo
"".bar # does not work now
I can't figure out why "".foo would work in this case but "".bar wouldn't.> no refinement inheritance
R2 included R1, which defined `bar` on String. Only the methods defined on R2 are used now with this change of plans. (I couldn't get to the ruby-lang issue, but I assume that's the reason).
Matsumoto gives two of the same examples, the first in how he wants the feature to work (R2 having the refinements of R1 if it includes it) and the second in how it works at the moment (or doesn't work).
If you try that code it breaks, he wants it to not break and return :bar.
If so, is there something to just learn from or copy for the Ruby team?