如何从块访问实例变量

时间:2013-11-05 20:24:11

标签: ruby

我对红宝石有一个相当蹩脚的问题。我有以下代码:

@node          = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
  query do
    fuzzy_like_this @node.title
  end
end

问题是,由于某种原因,我无法访问@node行中的fuzzy_like_this变量。即使找到了Node,它也会返回nil,我可以在第二行访问它。你能不能给我任何建议为什么会发生这种情况,我该怎样做才能更好地理解这种行为?我甚至不知道如何搜索它。


编辑:对不起标题中的拼写错误,当然它不应该是“全局”变量而是实例变量。

2 个答案:

答案 0 :(得分:2)

Node是一个实例变量,而不是全局变量。由于该块可能(在这种情况下,是)在另一个对象的上下文中执行,因此您的ivars不存在。将ivar值分配给本地名称应该有效,因为locals是词法范围的。

TL; DR: node = @node,在块中使用本地node

答案 1 :(得分:1)

以'@'开头的变量不是全局变量;它们是实例变量。这意味着它们属于某个特定对象,(大部分)是其他人无法访问的。

似乎正在发生的事情是search方法正在改变执行的上下文(可能通过instance_eval / instance_exec),这意味着,在块内,您的{{ 1}}不一样,你将无法访问相同的实例变量。

一个简单的解决方法是使用局部变量:

self

然后,如果你真的需要node = Node.find(params[:id]) @similar_nodes = Tire.search 'nodes', load: true do query do fuzzy_like_this node.title end end 作为实例变量,你可以稍后再分配它:

node