[#69084] [Ruby trunk - Feature #11124] [Open] [PATCH] lib/*: use monotonic clock for timeouts — normalperson@...
Issue #11124 has been reported by Eric Wong.
5 messages
2015/05/06
[#69138] [Ruby trunk - Feature #11136] [PATCH] webrick: avoid fcntl module — nobu@...
Issue #11136 has been updated by Nobuyoshi Nakada.
3 messages
2015/05/12
[#69160] [Ruby trunk - Feature #11146] [PATCH] variable.c: initialize generic_iv_tbl at start — nobu@...
Issue #11146 has been updated by Nobuyoshi Nakada.
4 messages
2015/05/13
[#69175] Re: [Ruby trunk - Feature #11146] [PATCH] variable.c: initialize generic_iv_tbl at start
— Eric Wong <normalperson@...>
2015/05/13
nobu@ruby-lang.org wrote:
[ruby-core:69409] [Ruby trunk - Bug #11182] Refinement with alias causes strange behavior
From:
shugo@...
Date:
2015-05-29 02:06:47 UTC
List:
ruby-core #69409
Issue #11182 has been updated by Shugo Maeda.
Koichi Sasada wrote:
> Wait. `each` is not good terminology for our project. Use `iterate` intead.
>
> ```ruby
> module OrderedHashEach
> refine Hash do
> def each
> sort.each{|k, v|
> yield k, v
> }
> end
> end
> end
>
> class MyHash < Hash
> def initialize *args
> args.each{|(k, v)|self[k] = v}
> end
>
> alias iterate each
> end
>
> h = MyHash.new([:b, 1], [:a, 2])
>
> using OrderedHashEach
> h.iterate{|k, v| p [k, v]} # [:b, 1] [:a, 2]
> ```
>
> It doesn't affect :( It is unexpected result for me.
If you need to refine iterate you should define OrderedHashIterate
and use it instead.
Refinements are designed not to change behavior implicitly.
If refinements are changed to affect aliases, someone might complain
that refinements don't support local rebinding.
----------------------------------------
Bug #11182: Refinement with alias causes strange behavior
https://bugs.ruby-lang.org/issues/11182#change-52680
* Author: Koichi Sasada
* Status: Feedback
* Priority: Normal
* Assignee: Shugo Maeda
* ruby -v: 2.3dev
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
The following script causes strange behavior.
```ruby
class C
def foo
p "C"
end
end
module M
refine C do
def foo
p "Refiend C"
end
end
end
class D < C
alias bar foo
end
using M
D.new.bar
#=> t.rb:21:in `<main>': undefined method `bar' for #<D:0x29fbf58> (NoMethodError)
```
It seems strange.
Maybe (1) C#foo or (2) M#C#foo should be called. But I'm not sure which is suitable.
Previous versions:
```
ruby 2.0.0p606 (2014-11-28 revision 48636) [i386-mswin32_110]
t.rb:9: warning: Refinements are experimental, and the behavior may change in future versions of Ruby!
"C"
ruby 2.1.5p312 (2015-03-10 revision 49912) [i386-mswin32_110]
"C"
```
---Files--------------------------------
1.PNG (38.7 KB)
2.PNG (43.7 KB)
4.PNG (38.5 KB)
3.PNG (37.9 KB)
alias_affected_by_original_refinement.diff (1.34 KB)
6.PNG (36.6 KB)
7.PNG (40.7 KB)
--
https://bugs.ruby-lang.org/