访问块内的变量

Nik*_*iko 1 ruby block rubymotion

我正在 RubyMotion 中使用某个块,并尝试访问其中在外部声明的实例变量。事实证明我无法从内部访问该变量。我在这里缺少任何明显的解决方案吗?谢谢!

这是代码

@my_var = true

Dispatch::Queue.concurrent.async do
  # can't access @my_var here
end
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 5

我的猜测是,async运行块时使用instance_eval,因此当在块内使用时,您的实例变量会绑定到其他一些对象。如果您只需要读取变量,只需在块内使用本地副本

@my_var = true
my_var = @my_var
Dispatch::Queue.concurrent.async do
  my_var
end
Run Code Online (Sandbox Code Playgroud)

或者如果你有一个访问器方法

@my_var = true
this = self
Dispatch::Queue.concurrent.async do
  this.my_var
end
Run Code Online (Sandbox Code Playgroud)

  • 局部变量始终可以在块内访问。`instance_eval` 仅更改块内 `self` 的值。因此,如果“instance_eval”接收器有一个名为“my_var”的实例方法,我的第一个示例将会失败。 (2认同)