Ruby 如何从块访问实例变量
关于ruby,我有一个很蹩脚的问题。我有以下代码:Ruby 如何从块访问实例变量,ruby,Ruby,关于ruby,我有一个很蹩脚的问题。我有以下代码: @node = Node.find(params[:id]) @similar_nodes = Tire.search 'nodes', load: true do query do fuzzy_like_this @node.title end end 问题是,由于某种原因,我无法访问模糊中的@node变量,就像这一行一样。它返回nil,即使已找到节点,并且我可以在第二行中访问它。你能给我一些建议吗?为什么
@node = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
query do
fuzzy_like_this @node.title
end
end
问题是,由于某种原因,我无法访问模糊中的@node
变量,就像这一行一样。它返回nil
,即使已找到节点,并且我可以在第二行中访问它。你能给我一些建议吗?为什么会这样?我该怎么做才能更好地理解这种行为?我甚至不知道如何去寻找它
编辑:很抱歉标题中的输入错误,当然它不应该是“全局”变量,而应该是实例变量。节点是实例变量,而不是全局变量。由于块可能(在本例中是)在另一个对象的上下文中执行,因此您的IVAR不在那里。将ivar值分配给本地名称应该有效,因为本地名称是词汇范围的
tl;博士:
node=@node
,在块内使用本地node
。节点是实例变量,而不是全局变量。由于块可能(在本例中是)在另一个对象的上下文中执行,因此您的IVAR不在那里。将ivar值分配给本地名称应该有效,因为本地名称是词汇范围的
tl;博士:
node=@node
,在块内使用本地node
。节点是实例变量,而不是全局变量。由于块可能(在本例中是)在另一个对象的上下文中执行,因此您的IVAR不在那里。将ivar值分配给本地名称应该有效,因为本地名称是词汇范围的
tl;博士:
node=@node
,在块内使用本地node
。节点是实例变量,而不是全局变量。由于块可能(在本例中是)在另一个对象的上下文中执行,因此您的IVAR不在那里。将ivar值分配给本地名称应该有效,因为本地名称是词汇范围的
tl;博士:
node=@node
,在块内使用本地node
。以“@”开头的变量不是全局变量;它们是实例变量。这意味着它们属于特定的对象,其他对象(大部分)无法访问它们
似乎正在发生的是search
方法正在改变执行的上下文(可能是通过/),这意味着在块内部,您的self
不一样,您将无法访问相同的实例变量
一个简单的解决方法是使用局部变量:
node = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
query do
fuzzy_like_this node.title
end
end
然后,如果确实需要节点
作为实例变量,则可以稍后分配它:
@node = node
以“@”开头的变量不是全局变量;它们是实例变量。这意味着它们属于特定的对象,其他对象(大部分)无法访问它们
似乎正在发生的是search
方法正在改变执行的上下文(可能是通过/),这意味着在块内部,您的self
不一样,您将无法访问相同的实例变量
一个简单的解决方法是使用局部变量:
node = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
query do
fuzzy_like_this node.title
end
end
然后,如果确实需要节点
作为实例变量,则可以稍后分配它:
@node = node
以“@”开头的变量不是全局变量;它们是实例变量。这意味着它们属于特定的对象,其他对象(大部分)无法访问它们
似乎正在发生的是search
方法正在改变执行的上下文(可能是通过/),这意味着在块内部,您的self
不一样,您将无法访问相同的实例变量
一个简单的解决方法是使用局部变量:
node = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
query do
fuzzy_like_this node.title
end
end
然后,如果确实需要节点
作为实例变量,则可以稍后分配它:
@node = node
以“@”开头的变量不是全局变量;它们是实例变量。这意味着它们属于特定的对象,其他对象(大部分)无法访问它们
似乎正在发生的是search
方法正在改变执行的上下文(可能是通过/),这意味着在块内部,您的self
不一样,您将无法访问相同的实例变量
一个简单的解决方法是使用局部变量:
node = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
query do
fuzzy_like_this node.title
end
end
然后,如果确实需要节点
作为实例变量,则可以稍后分配它:
@node = node
我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货