From: shugo@... Date: 2015-12-12T04:35:55+00:00 Subject: [ruby-core:72074] [Ruby trunk - Bug #11779] Module#using does not make sense as a method Issue #11779 has been updated by Shugo Maeda. Assignee set to Yukihiro Matsumoto bug hit wrote: > > Perhaps, perhaps not. I depends on what the phrase "whatever the class body can do" mean. > > For exmaple, such methods should be able to define constants in a class, but need not to > > be able to define constants in the same way as in a class body. > > Of course I don't mean in the same exact way, meta-programming is different than native syntax. However the question of "how" does not apply here, because you are arguing that it should be forbidden (not different), and I'm saying that if a class body can call a module_eval with using, then a class macro method should be able to, as well. As I stated before, it might be better to introduce Kernel#using, which ignores module_eval blocks as constant lookup do. ```ruby module Foo refine String do def foo puts "foo" end end end module Bar end module Baz Bar.module_eval do using Foo "".foo #=> foo end "".foo #=> foo end "".foo #=> error ``` I'd like to hear Matz's opinion. ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-55486 * Author: bug hit * Status: Feedback * Priority: Normal * Assignee: Yukihiro Matsumoto * ruby -v: 2.2.3 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- 1. it can't be called from another method 2. the receiver must be self 3. since refinements are lexically scoped the self receiver must match the currently open class #3 is particularly curious ```ruby module Refinement refine String do def refined? true end end end module Foo def self.refined? ''.refined? rescue false end end module Bar def self.refined? ''.refined? rescue false end Foo.module_eval do using Refinement end end p Foo.refined? #false ``` The module_eval `#using` call does not raise (it's not from a method and the receiver is self), but evidently because currently open class does not match self, it does not do anything. So it should at least raise. So `#using`, though a method, does not function as a method, which is misleading. -- https://bugs.ruby-lang.org/