我对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的副本或副本,以便一个不受另一个影响?
答案 0 :(得分:1)
如果您阅读文档:
此方法返回未定义的值。
按给定标准过滤此解决方案序列。
这很模糊,我同意,但有一点是突出的 - 它返回一个undefined value
,由此我得出结论,这是一个破坏性的方法,它改变了当前的对象而不是返回一个新的对象。过滤器的结果。另一个提示是它是Also known as: filter!
,因为以!
结尾的方法在ruby中具有破坏性。
查看源代码验证了这一结论,因为它在代码中使用了reject!
。
关于如何正确地做到这一点的解决方案 - 我对这个库并不熟悉,事实证明很难从文档中弄清楚它,我建议你找到一种方法来做到这一点。以下内容(按照大多数建议,从最后一个回退开始排序):
dup
或clone
API filter
... 也许可以尝试联系作者提供自己的推荐......