如何覆盖 class 方法
How to override class methods
我想覆盖方法 Selenium::WebDriver.for
。这是我试过的:
module SeleniumWebDriverExtension
def self.for(browser, *args)
if browser != :phantomjs
super(browser, *args)
else
options = {
"phantomjs.cli.args" => ["--ssl-protocol=tlsv1"]
}
capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs(options)
super(browser, desired_capabilities: capabilities)
end
end
end
Selenium::WebDriver.prepend(SeleniumWebDriverExtension)
但是调用 Selenium::Webdriver.for(:phantomjs)
时出现错误。
NoMethodError: super: no superclass method `for' for Selenium::WebDriver::Driver:Class
如何从覆盖方法中调用原始方法?
module SeleniumWebDriverExtension
def for(browser, *args)
...
end
end
Selenium::WebDriver.singleton_class.prepend(SeleniumWebDriverExtension)
何时在像这样的模块中使用 self
:
def self.for(browser, *args)
end
它被声明为 module function
,而不是将包含此模块的 class 上的实例方法。这意味着当模块混合到另一个 class.
时,不会出现在包含的 classes 上
类似于写法:
def SeleniumWebDriverExtension::for
end
因此,如果您想从模块内调用 super
,请将其声明为简单的 instance method
,就像已接受的答案所建议的那样。只是想让你明白这背后的原因。
顺便说一句 SeleniumWebDriverExtension.ancestors
要清楚继承层次结构。
我想覆盖方法 Selenium::WebDriver.for
。这是我试过的:
module SeleniumWebDriverExtension
def self.for(browser, *args)
if browser != :phantomjs
super(browser, *args)
else
options = {
"phantomjs.cli.args" => ["--ssl-protocol=tlsv1"]
}
capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs(options)
super(browser, desired_capabilities: capabilities)
end
end
end
Selenium::WebDriver.prepend(SeleniumWebDriverExtension)
但是调用 Selenium::Webdriver.for(:phantomjs)
时出现错误。
NoMethodError: super: no superclass method `for' for Selenium::WebDriver::Driver:Class
如何从覆盖方法中调用原始方法?
module SeleniumWebDriverExtension
def for(browser, *args)
...
end
end
Selenium::WebDriver.singleton_class.prepend(SeleniumWebDriverExtension)
何时在像这样的模块中使用 self
:
def self.for(browser, *args)
end
它被声明为 module function
,而不是将包含此模块的 class 上的实例方法。这意味着当模块混合到另一个 class.
类似于写法:
def SeleniumWebDriverExtension::for
end
因此,如果您想从模块内调用 super
,请将其声明为简单的 instance method
,就像已接受的答案所建议的那样。只是想让你明白这背后的原因。
顺便说一句 SeleniumWebDriverExtension.ancestors
要清楚继承层次结构。