如何将在嵌套方法中声明的局部变量设置为父方法的作用域内?

时间:2019-04-22 14:53:53

标签: ruby scope

我在Ruby的作用域方面遇到问题。

我有一个'foobar'方法,里面有两个方法。我希望每个'foobar'方法都可以初始化一个'foobar'可以使用的变量。

以下是我的错误和代码:

  

未定义的局部变量或方法“ old_var”

def initialize
    @sandbox = #working api call
end

def foobar

        @sandbox.function() do |resp|
             old_var = resp.var.to_f
        end

        sleep(10)

        @sandbox.function() do |resp|
             new_var = resp.var.to_f
        end

        new_var + old_var;

    end

2 个答案:

答案 0 :(得分:2)

将proc的结果设置为old_var,以便在使用时在同一作用域中声明它。

old_var = 
  @sandbox.function() do |resp|
    resp.var.to_f
  end

new_var相同:

new_var = 
  @sandbox.function() do |resp|
    resp.var.to_f
  end

  

如何将在嵌套方法中声明的局部变量设置为父方法的作用域内?

回答标题中的问题:那是不可能的。


如果需要在从嵌套块返回值之前执行一些操作,请使用break

value =
  @sandbox.function() do |resp|
    foo = 42
    # do something else
    break foo
  end

答案 1 :(得分:1)

在块内部定义的变量的作用域为该块。在块外定义变量,然后可以在块内修改变量。这将允许您在块完成之后访问它们。

def initialize
    @sandbox = #working api call
end

def foobar
    # defining these two variables so you can set them
    # inside the block later
    old_var = nil
    new_var = nil

    @sandbox.function() do |resp|
         old_var = resp.var.to_f
    end

    sleep(10)

    @sandbox.function() do |resp|
         new_var = resp.var.to_f
    end

    new_var + old_var;
end