2016-01-04 2 views
0

У меня есть основной файл, и вы хотите извлечь из него некоторый код и перенести его в другой, однако он не работает с экземплярами. Например:Как получить доступ к методам класса из другого файла

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) 

Как получить доступ к методам класса из другого файла?

ответ

1

Методы доступны в первом файле. По сути, выполнение требования - это то же самое, что и запись всего этого файла.

Поступая только что, вы можете увидеть часть вашей проблемы:

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
+0

Спасибо. Можете ли вы также опубликовать хороший учебник для глубокого понимания классов. –

+0

«Написание методов в глобальной области определяет их на объекте, называемом main». - Нет, они становятся «частными» методами экземпляра 'Object', а не singleton-методами' main' (кроме IRb, где они становятся «обычными» методами экземпляра 'Object'). –

+0

Спасибо, что поняли, что, @ JörgWMittag, я обновлю свой ответ. – Jesper

0

Поскольку ваш вопрос оказался - насколько я могу сказать - больше вопрос Руби и не полностью зависит от селена, есть другой подход, вы могли бы взять.

Это использование: 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 
Смежные вопросы