Project

General

Profile

Actions

Feature #8481

closed

Updated by Anonymous about 12 years ago

Then, if it works lexically, it is not a function of Module, but of ... of ... Kernel? If it modified the module logically, it would be Module's concern. But like this, it is a concern of the interpreter, imao. Something like "private". I don't even know if "private" keyword is method :-)

Updated by matz (Yukihiro Matsumoto) about 12 years ago

As I already told you, I can accept (or even encourage) this change.
I am interested in how implementers of other Ruby.

Matz.

Updated by shugo (Shugo Maeda) about 12 years ago

boris_stitnicky (Boris Stitnicky) wrote:

Then, if it works lexically, it is not a function of Module, but of ... of ... Kernel? If it modified the module logically, it would be Module's concern. But like this, it is a concern of the interpreter, imao. Something like "private". I don't even know if "private" keyword is method :-)

private is not a keyword. private at toplevel is the method main.private and private at module level is the method Module#private. Hence, it's reasonable to provide module-level using as Module#using.

Updated by headius (Charles Nutter) about 12 years ago

I do not currently have a problem with Module level #using, provided it is still lexical. The same mechanism for file-level #using would work here: if a "using" call is present in the code, we'll treat all calls in that scope as potentially refined (different call logic). Scopes without a #using call will not do refined dis.

A few other clarifications I think are important:

  • Since this is lexical, you can't send or send :using from any scope and expect it to work. It might work by accident on some implementations, but this is non-spec. Should it be specified that it explicitly does not work?
  • I assume we still do not have "magic" #send and #instance_method and friends, correct?

Regarding timeline for implementation in JRuby...

Because of the invasive nature of the changes required, we are not comfortable implementing it in the JRuby 1.7.x codebase. Therefore, we will probably not be able to start in earnest on a final implementation until after we branch 1.7. However, I would like to get a implementation based on current 2.0 and upcoming 2.1 refinement features so we can work through issues sooner rather than later. I hope to do that this month...but hope is a complicated thing.

Updated by matz (Yukihiro Matsumoto) about 12 years ago

  • It's OK that send(:using) do not work
  • we will not provide magic send in the near future (no plan at all)

Matz.

Updated by shugo (Shugo Maeda) about 12 years ago

headius (Charles Nutter) wrote:

A few other clarifications I think are important:

  • Since this is lexical, you can't send or send :using from any scope and expect it to work. It might work by accident on some implementations, but this is non-spec. Should it be specified that it explicitly does not work?
  • I assume we still do not have "magic" #send and #instance_method and friends, correct?

Agreed. Reflection API should not care refinements in Ruby 2.1.

Because of the invasive nature of the changes required, we are not comfortable implementing it in the JRuby 1.7.x codebase. Therefore, we will probably not be able to start in earnest on a final implementation until after we branch 1.7. However, I would like to get a implementation based on current 2.0 and upcoming 2.1 refinement features so we can work through issues sooner rather than later. I hope to do that this month...but hope is a complicated thing.

I see. Thanks for your effort for refinements.

Updated by shugo (Shugo Maeda) about 12 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r41261.
Shugo, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • eval.c (mod_using): new method Module#using, which activates
    refinements of the specified module only in the current class or
    module definition. [ruby-core:55273] [Feature ]

  • test/ruby/test_refinement.rb: related test.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0