[ruby-core:76354] [Ruby trunk Bug#12535] are there 2 sleep methods defined?

From: cardoso_tiago@...
Date: 2016-07-12 12:10:27 UTC
List: ruby-core #76354
Issue #12535 has been updated by Tiago Cardoso.


I've just tried that, it's not delivering the expected result. Try this out:

~~~ruby
module AlternativeSleep           
  def sleep(*)                    
    puts "going to sleep now..."  
    super                         
  end                             
end                               
                                  
Kernel.prepend AlternativeSleep   
                                  
# none of these work
Kernel.sleep 1                    
sleep 1                           
~~~

I guess it's because Kernel is a module already. 

----------------------------------------
Bug #12535: are there 2 sleep methods defined?
https://bugs.ruby-lang.org/issues/12535#change-59598

* Author: Tiago Cardoso
* Status: Rejected
* Priority: Normal
* Assignee: 
* ruby -v: 
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
I'm updating this gem which "patches" the sleep method to use prepend, as I wanted to drop support to ruby < 2.0 . (previous implementation was using alias method chain like solution)

So I came across this funny behaviour:

```ruby
module AlternativeSleep
  def sleep(*)
    puts "going to sleep now..."
    super
  end
end

class << self
  prepend AlternativeSleep
end
class << Kernel
  prepend AlternativeSleep
end

puts "these are the locations..."

puts Kernel.method(:sleep)
puts method(:sleep)

puts "now to work. if you see the going to sleep message only once, there's your bug"

Kernel.sleep 1
sleep 1
```

In order to make sleep work in both cases, I have to do those 2 prepends. Try to comment one of them, and you'll see that one of them will always work. 


I'm led to believe that sleep method has two implementations, although that doesn't seem to make sense. Could you provide with some insight?

When I was using the alias-method-chain example, I was including in the main object, as `main#sleep` somehow seemed to land in `Kernel.sleep` (?) . 



-- 
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>

In This Thread

Prev Next