gpt4 book ai didi

ruby - 如何在当前类的上下文中运行 IRB.start

转载 作者:数据小太阳 更新时间:2023-10-29 06:27:25 27 4
gpt4 key购买 nike

我刚看完 PragProg Continuous Testing With Ruby,他们讨论了在当前类的上下文中调用 IRB 以手动检查代码。

但是,他们引用说,如果您在类中调用 IRB.startself 是预定义的,并且指的是调用 start 时我们所在的对象 这对我来说不是真的。

即使是非常简单的例子

a = "hello"
require 'irb'
ARGV.clear # otherwise all script parameters get passed to IRB
IRB.start

当我尝试访问 a 变量时,我得到了明显的结果

NameError: undefined local variable or method `a' for main:Object

只有当我将 a 更改为全局变量时它才有效

$a = "hello"
require 'irb'
ARGV.clear # otherwise all script parameters get passed to IRB
IRB.start

然后我就可以访问了

irb(main):001:0> $a
=> 1

有没有什么方法可以访问当前类中的局部变量和实例变量?

最佳答案

正如您已经发现的那样,self 并不引用启动​​ IRB 的对象,而是引用 TOPLEVEL_BINDING,它似乎是 Object 类本身。

您仍然可以使用特定的类或对象作为上下文来运行 IRB session ,但这并不像启动 IRB 那样简单。

如果您关心的是使用特定上下文启动 IRB,那么当您手动启动 IRB 时,这真的很容易做到。只需正常启动 IRB,然后调用 irb 方法,将您想要的对象/类作为上下文传递给它。

$ irb
irb(main):002:0> require 'myclass'
=> true
irb(main):003:0> irb MyClass
irb#1(MyClass):001:0> self
=> MyClass

您还可以通过编程方式启动 IRB session 并指定上下文,但这并不像应该的那样容易,因为您必须重现一些 IRB 的启动代码。在 IRB 源代码中进行了大量试验和挖掘之后,我得出了一些可行的方法:

require 'irb'
IRB.setup nil
IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
require 'irb/ext/multi-irb'
IRB.irb nil, self

关于ruby - 如何在当前类的上下文中运行 IRB.start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com