Project

General

Profile

Bug #12535

Updated by nobu (Nobuyoshi Nakada) almost 8 years ago

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` main#sleep somehow seemed to land in `Kernel.sleep` Kernel.sleep (?) .

Back