2015-02-26 2 views
0

Я использую ruby-prolog. Я хочу запустить задачу для запроса факта.Как получить доступ к членам другого класса в другом файле

demo.rb:

require 'ruby-prolog' 

c = RubyProlog::Core.new 
c.instance_eval do 

person['name','brian'].fact 
person['name','James'].fact 

puts 'all the names are: ' 
p query(person['name', :A]) 

end 

Это прекрасно работает. Теперь я хочу запустить запрос внутри Rake. Это проблема, потому что я не знаю, как получить доступ к person[] из другого файла.

Rakefile.rb:

require_relative 'demo.rb' 

task :test do |variable| 
    puts 'all the names are: ' 
    p query(person['name', :A]) 
end 

Ошибка:

all the names are: rake aborted! NameError: undefined local variable or method `person' for main:Object

Я надеюсь, что это может быть решена путем передачи объекта обратно каким-то образом. Я попытался получить доступ к c, но это не сработало. Есть идеи?

+1

ли не код должен быть блок для RubyProlog :: Core' экземпляр 'как это в рабочем случае? – lurker

ответ

1

В вашем демо-файле обе переменные person и c являются локальными переменными и не будут доступны извне этого контекста. Если вам требуется demo.rb в сеанс irb, поведение должно быть одинаковым; ни c, ни person не будут определены.

Хороший способ справиться с этим в задачах грабли состоит в том, чтобы сохранить любую логику из самой задачи рейка и только вызвать другой объект, который выполняет задачу. Для быстрого и грязного Например, вы можете изменить свой код, например:

# demo.rb 
require 'ruby-prolog' 

class Demo 
    def self.run_demo 
    # Existing code: 

    c = RubyProlog::Core.new 
    c.instance_eval do 

     person['name','brian'].fact 
     person['name','James'].fact 

     puts 'all the names are: ' 
     p query(person['name', :A]) 

    end 
    end 
end 

и

# Rakefile.rb 
require_relative 'demo.rb' 

task :test do 
    Demo.run_demo 
end 
+0

Я ищу, чтобы разделить мои факты с моими запросами. Это не доводит меня до конца, но OO - хорошее начало. Я могу работать над тем, чтобы разделить это немного больше. Свойства Ruby кажутся слишком многословными для создания элементов свойств. Я посмотрю вокруг, чтобы узнать, могу ли я сделать факты в частных полях. –

+0

Проблема здесь была связана только с локальными переменными и контекстами Ruby; реализация запросов и фактов не повлияла. Еще один (худший) способ, которым проблема могла быть решена, вместо использования локальных переменных в вашем файле 'demo.rb',' c' и 'person' могли быть сделаны переменными экземпляра (' @ c' и '@ person'). Затем они будут похожи на переменные экземпляра для среды Ruby и доступны из обоих файлов. – aerook

Смежные вопросы