Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从块访问实例变量_Ruby - Fatal编程技术网

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,即使已找到节点,并且我可以在第二行中访问它。你能给我一些建议吗?为什么

关于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
,即使已找到节点,并且我可以在第二行中访问它。你能给我一些建议吗?为什么会这样?我该怎么做才能更好地理解这种行为?我甚至不知道如何去寻找它



编辑:很抱歉标题中的输入错误,当然它不应该是“全局”变量,而应该是实例变量。

节点是实例变量,而不是全局变量。由于块可能(在本例中是)在另一个对象的上下文中执行,因此您的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

我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!我看不到任何全局变量…已添加编辑。谢谢你的提示!对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货对这就是确切的原因。。抢手货