[ruby-core:94386] [Ruby master Bug#16107] Module#refine and Module#using behaved unexpectedly
From:
nobu@...
Date:
2019-08-16 13:19:06 UTC
List:
ruby-core #94386
Issue #16107 has been updated by nobu (Nobuyoshi Nakada).
I shortened the example a little.
```ruby
class A
end
module M1
refine A do
def foo
puts "foo"
end
end
end
module M2
using M1
refine A do
A.new.foo
end
end
```
It seems that a `refine` block does not inherit outer `using`s.
----------------------------------------
Bug #16107: Module#refine and Module#using behaved unexpectedly
https://bugs.ruby-lang.org/issues/16107#change-80801
* Author: UlyssesZhan (有丘 詹)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x64-mingw32]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
The issue happened when I tried to run the code below:
``` ruby
# Main.rb
class A
end
class B
end
module M1
refine A do
def foo *args
puts "foo"
end
end
end
using M1
module M2
def self.enable_foo
refine B do
def call_foo *args
A.new.foo *args
end
end
end
end
M2.enable_foo
using M2
B.new.call_foo
```
I expected it to output `foo`, but I got this:
```
Traceback (most recent call last):
1: from Main.rb:28:in `<main>'
Main.rb:20:in `call_foo': undefined method `foo' for #<A:0x000000000719f3a0> (NoMethodError)
Did you mean? for
```
I tried to put `using M1` in M2 and its singleton class, but the same error was raised.
Maybe it is a Ruby bug. If it is not, I hope to get a workaround when I encounter similiar situations.
`RUBY_VERSION` is `"2.6.0"`, and `RUBY_PLATFORM` is `"x64-mingw32"`.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>