将Kernel.local_variables附加到绑定范围

时间:2017-04-27 08:51:22

标签: ruby scope read-eval-print-loop

我为一个能够运行ruby脚本的软件做了一个基本的REPL。我希望能够在启动时将变量从先前的范围传递到REPL,因此我可以轻松地调试我的代码。

def launchREPL(locals)
    puts "\"Starting REPL...\""
    __b = binding   #Evaluating in a binding, keeps track of local variables
    __s = ""
    __b.local_variables = locals  ## <-- ERROR OCCURS HERE
    bStartup = true
    while bStartup || __s != ""
        # If startup required skip evaluation step
        if !bStartup

            #Evaluate command
            begin
                __ret = __s + "\n>" + __b.eval(__s).to_s
            rescue 
                __ret = __s + "\n> Error: " + $!.to_s
            end
            puts __ret
        else
            #REPL is already running
            bStartup = false
        end

        #Read user input & print previous output
        __s = Application.input_box(__ret,"Ruby REPL","")
        __s == nil ? __s = "" : nil
    end
end

以上是我启动REPL的代码。这个想法是我能做到的:

launchREPL(Kernel.local_variables)

然后能够访问REPL中前一个范围内的所有局部变量。

但是我收到错误'local_variables' of '__b' is not defined。有什么方法可以解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:0)

稍后进行一些测试,我想出了这个:

__b.eval("locals = #{locals}")

然而......我已经意识到这只会返回局部变量的名称而不是变量的值......