ruby设置变量与使用变量

时间:2014-05-29 13:49:52

标签: ruby

我对ruby有点新鲜,所以可能有一个简单的解决方法。

但基本上我想重用一个对象@result,这样当我对它执行一个方法(filter)时,我继续使用原始对象。但是,当我运行该方法时,对象本身似乎正在发生变化。

对象(@result)是RDF :: Query :: Solutions类 http://rdf.rubyforge.org/RDF/Query/Solutions.html#filter-instance_method

@result = rdf_query(query) # solutions object 

此时@result包含所有解决方案,大约30个结果

@pubinfo = @result.filter(:ptype => RDF::URI("http://scta.info/pubInfo"))

此时@result变得等同于我想要的@pubinfo。只有5个左右的结果

@contentinfo = @result.filter(:ptype => RDF::URI("http://scta.info/contentInfo"))

此时@contentinfo出现nil,因为过滤器实际上位于前一过滤器留下的解决方案上。但我想在@result

的原始内容上运行此过滤器
@linkinginfo = @result.filter(:ptype => RDF::URI("http://scta.info/linkingInfo"))

再次预测@linking为'nil',因为@result在前一个过滤器中设置为nil。但我不希望@result改变。

请帮忙。

更新

看看如果我尝试以下

会发生什么
@pubinfo = @result
@pubinfo2 = @pubinfo.filter(:ptype => RDF::URI("http://scta.info/pubInfo"))
binding.pry

此时@result =已被过滤。为什么@result应该受到@pubinfo的影响。换句话说,如何让@pubinfo成为@result的副本或副本,以便一个不受另一个影响?

1 个答案:

答案 0 :(得分:1)

如果您阅读文档:

  

此方法返回未定义的值。

     

按给定标准过滤此解决方案序列。

这很模糊,我同意,但有一点是突出的 - 它返回一个undefined value,由此我得出结论,这是一个破坏性的方法,它改变了当前的对象而不是返回一个新的对象。过滤器的结果。另一个提示是它是Also known as: filter!,因为以!结尾的方法在ruby中具有破坏性。

查看源代码验证了这一结论,因为它在代码中使用了reject!

关于如何正确地做到这一点的解决方案 - 我对这个库并不熟悉,事实证明很难从文档中弄清楚它,我建议你找到一种方法来做到这一点。以下内容(按照大多数建议,从最后一个回退开始排序):

  1. 查找非破坏性API
  2. 查找dupclone API
  3. 在每个filter ...
  4. 之前重新查询

    也许可以尝试联系作者提供自己的推荐......