【问题标题】:irb access pre-load script local variablesirb 访问预加载脚本局部变量
【发布时间】:2015-08-18 21:11:06
【问题描述】:

在开始交互式会话之前,我正在使用 irb -I . -r script.rbrequire 脚本。在全局范围内定义的函数可用,但变量不可用,除非它们用@ 声明

有没有办法访问在脚本的全局上下文中定义的局部变量或更好的方法来做到这一点


script.rb

def func() "..." end
a = "str"
@b = 1

然后在irb 开始之后:

irb(main):001:0> a

NameError: undefined local variable or method `a' for main:Object
    from (irb):1
    from /usr/bin/irb:11:in `<main>'

irb(main):002:0> @b

=> 1

irb(main):003:0> func

=> "..."

我假设脚本的内容就像在函数中定义一样执行(例如:C 类型语言中的main),因此全局上下文中的变量是在该范围之外无法访问的局部变量

那么大多数人在编写脚本时使用@ 变量吗?

用例的范围很窄(脚本开发),解决方案很简单(用@variable搜索替换任何variable),但我正在学习语言的语义,我很好奇这。 execution context 不能以某种方式暴露并合并到当前上下文中吗?

【问题讨论】:

  • -r 使用require 加载库并根据its documentation“局部变量不会传播到加载环境。”.
  • @Stefan 谢谢,我现在正在查看文档以寻找某种“带绑定”功能,否则我会尝试写一些东西来将绑定暴露给 irb 会话

标签: ruby irb


【解决方案1】:

没有。您不能从不同的范围访问局部变量。这就是局部变量的全部意义:它们在定义它们的范围内是局部的。

在这种情况下,ascript.rb 脚本主体的本地对象。

【讨论】:

  • 我同意局部变量的目的是将上下文与调用上下文分开并避免污染等。我正在寻找某种元编程解决方案,更多的是为了理解而不是实际生产使用
  • 没有冒犯,但我必须冒犯。如果您不清楚本地与全球范围(您的问题证明了这一点),那么您的理解从那里开始,元编程魔法是在您构建光剑之后。
  • @engineerDave 是的,我对 Ruby 有点陌生。在 javascript 中,全局上下文在脚本和交互式节点会话中是相同的。
  • 是的,在 JS LOL 中一切都是全局性的,但范围在 ruby​​ 中很重要,因为 Proc 和 lamdas 之类的东西,祝你好运!
【解决方案2】:

也许binding.irb 就是你要找的。​​p>

script.rb:

def func() "..." end
a = "str"
@b = 1
binding.irb

来自documentation

打开一个调用 binding.irb 的 IRB 会话,它允许 交互式调试。您可以调用任何可用的方法或变量 在当前范围内,如果需要,可以改变状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-01-19
    • 1970-01-01
    • 2021-02-24
    • 2011-04-19
    相关资源
    最近更新 更多