如何从另一个文件访问类方法

时间:2016-01-04 18:04:12

标签: ruby selenium

我有一个主文件,并希望从中提取一些代码并将其移动到另一个,但它不适用于实例。例如:

require "selenium-webdriver"
require "./out.rb"
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://www.google.com"

hello
save

out.rb是:

def save
  driver.save_screenshot('screenshot.png')
end

def hello
  puts "hello"
end

hello
in `<main>': undefined local variable or method `save' for main:Object(NameError)

如何从其他文件访问类方法?

2 个答案:

答案 0 :(得分:1)

可以在第一个文件中访问这些方法。实质上,执行require与在同一文件中写入所有内容相同。

通过这样做,您可以看到部分问题:

require "selenium-webdriver"

def save
  driver.save_screenshot('screenshot.png')
end

def hello
  puts "hello"
end

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://www.google.com"

hello
save

变量driver在方法save内无法使用。

解决这个问题的一种方法是让save将驱动程序作为参数:

def save(driver)
  driver.save_screenshot('screenshot.png')
end

# Call the method like this
save(driver)

有些观点:

  • 不建议在全局范围内编写代码。尝试在课堂上包装你想要做的事情。
  • 您定义的方法实际上不是类方法。正如@JörgWMittag指出:they become private instance methods of Object

答案 1 :(得分:0)

由于您的问题似乎是 - 据我所知 - 更多的是Ruby问题而不完全依赖于Selenium,您可以采取另一种方法。

那就是使用:require_relative './out'

如果out.rb文件位于不同的文件夹中,则需要指定路径,但我编写了几个程序,其中我只做了类似require_relative 'out'的操作。我还没弄清楚它为什么要求或不要求./前缀,所以最好先用它来尝试。

尝试一下:

require "selenium-webdriver"
require_relative "./out"

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://www.google.com"

hello
save