Project

General

Profile

Bug #17509

Updated by nobu (Nobuyoshi Nakada) over 3 years ago

When using `defined?(super)` to check that a superclass method exists before calling `super`, including modules with a custom `respond_to?` method seems to break the check so it wrongfully returns a truthy value, even though the superclass method doesn't exist. 

 This only happens on Ruby 3.0.0 and works fine on previous Ruby versions. This is possibly related to this change: https://github.com/ruby/ruby/pull/3777 

 ### Example  

 ```ruby ``` 
 module SomeModule 
   def a_method 
     defined?(super) ? super : :no_super_method 
   end 
 end 

 module RespondModule 
   def respond_to?(*) 
     super 
   end 
 end 

 class PlainClass 
   include SomeModule 
 end 

 class ModuleClass 
   include RespondModule 
   include SomeModule 
 end 

 puts "PlainClass: #{PlainClass.new.a_method}" 
 puts "ModuleClass: #{ModuleClass.new.a_method}" 
 ``` 

 ### Actual Result on Ruby 3.0.0p0 

 ``` 
 PlainClass: no_super_method 
 test.rb:3:in `a_method': super: no superclass method `a_method' for #<ModuleClass:0x00007fd77383f908> (NoMethodError) 
 Did you mean?    method 
	 from test.rb:24:in `<main>' 
 ``` 

 ### Expected Result (like on older versions) 

 ``` 
 PlainClass: no_super_method 
 ModuleClass: no_super_method 
 ``` 

 Thanks to Rafael França for helping me unravel this.

Back