-
-
Save ahoward/736721 to your computer and use it in GitHub Desktop.
| BEGIN { | |
| require 'net/http' | |
| Net::HTTP.module_eval do | |
| alias_method '__initialize__', 'initialize' | |
| def initialize(*args,&block) | |
| __initialize__(*args, &block) | |
| ensure | |
| @debug_output = $stderr ### if ENV['HTTP_DEBUG'] | |
| end | |
| end | |
| } |
AndrewVos: no, cause he is changing class definition. He could call super if he would create a new class:
class MyHTTP < Net::HTTP
def initialize(*)
super
ensure
@debug_output = $stderr
end
end
Interesting. First time I've seen BEGIN before, and googling it was kind of tricky :) (did get it eventually though).
Ok. I actually thought that super would call the same method on the parent class!
I expected this kind of thing to work:
def method_override
super
end
AndrewVos: you're right, super will call method from parent class. But in that gist inheritance is not used, class is evaled.
Ok I get it I think. why couldn't it be written like this though?
require 'net/http'
class Net::HTTP
def initialize(*args,&block)
super
ensure
@debug_output = $stderr ### if ENV['HTTP_DEBUG']
end
end
Is it because Net:HTTP is actually a module and not a class?
@AndrewVos: the code you've posted overrides Net::HTTP#initialize and supers to the definition of initialize in Net::HTTP's superclass. This means it totally skips Net::HTTP's own definition of initialize. That's not what you want to do :(.
Why module_eval? Isn't this exactly the same, and (imho) much more readable?
module Net
class HTTP
alias_method '__initialize__', 'initialize'
def initialize(*args,&block)
__initialize__(*args, &block)
ensure
@debug_output = $stderr ### if ENV['HTTP_DEBUG']
end
end
end
Couldn't you remove line 6 and replace line 9 with "super"?