【问题标题】:How to access members of another class in a different file如何访问不同文件中另一个类的成员
【发布时间】:2015-04-28 08:16:31
【问题描述】:

我正在使用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

错误:

所有的名字都是:rake aborted! NameError:未定义的局部变量 或 main:Object 的方法“人”

我希望这可以通过以某种方式传回一个对象来解决。我尝试访问c,但没有成功。有什么想法吗?

【问题讨论】:

  • 代码不需要像在工作案例中那样成为RubyProlog::Core 实例的块吗?

标签: ruby rake


【解决方案1】:

在您的演示文件中,变量personc 都是局部变量,无法从该上下文之外访问。如果您需要 demo.rb 进入 irb 会话,则行为应该相同; cperson 都不会被定义。

在 rake 任务中处理此问题的一个好方法是将任何和所有逻辑保留在 rake 任务本身之外,并且只调用另一个负责该任务的对象。对于一个快速而肮脏的例子,你可以这样改变你的代码:

# 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

【讨论】:

  • 我希望将我的事实与我的查询分开。这并没有让我一路走好,但是 OO 是一个好的开始。我可以想办法把这个分开一点。 Ruby 属性对于创建属性成员来说似乎有点过于冗长。我会环顾四周,看看是否可以将事实转化为私有字段。
  • 这里的问题只与 Ruby 局部变量和上下文有关;查询和事实的实现并没有什么不同。可以解决问题的另一种(更糟糕的)方法是在您的 demo.rb 文件中使用局部变量,cperson 可以被设为实例变量(@c@person)。然后它们就像 Ruby 环境的实例变量一样,可以从两个文件中访问。
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多