3

我读了这个问题,但这并没有回答。是否有相当于“python -i”的红宝石?

如果我的脚本是,

#!/usr/bin/ruby

hello = "Hello World"

如果我使用irb -r main.rb,我得到,

1.8.7 :001 > puts hello
NameError: undefined local variable or method `hello' for #<Object:0x7fb1486f4298>
        from (irb):1
1.8.7 :002 > 

仅当我将 hello 定义为全局时才有效。所以,它实际上不是“python -i”的等价物。

那么,确切的等价物是什么?

4

2 回答 2

5

根据Kernel#load 文档,

在任何情况下,加载文件中的任何局部变量都不会传播到加载环境。

如果您不喜欢全局变量或常量,一种方法是将数据包装在模块中,例如:main.rb:

module Wtf
  @hello= "world"
  def self.hello; @hello end
end

$ irb -r main.rb

> wtf.你好

> “世界”

于 2012-12-25T11:55:10.140 回答
1

所以事实证明实际上有一种邪恶的黑客方式来做到这一点:

ruby -rpry <(echo "$(cat main.rb)\nbinding.pry")

(需要pry宝石)

解释:

<(...)是一个 Bash进程替换,它有效地创建了一个管道,其中包含计算括号中的表达式的结果,然后 Ruby 可以对其进行计算。

输出文件的echo "$(cat main.rb)\nbinding.pry"内容,在本例中名为main.rb,并添加换行符和 Ruby 代码binding.pry,当与requireing prywith结合使用时,-rpry可以启用 Pry 的运行时调用,将整个程序的状态公开给交互式调试器。

例子:

main.rb(从上面使用你的)

$ ruby -rpry <(echo "$(cat main.rb)\nbinding.pry")

From: /proc/self/fd/11 @ line 4 :


[1] pry(main)> puts hello
Hello World
=> nil
[2] pry(main)> 

注意事项:

如果您的程序中的逻辑依赖于访问任何变量,例如_file_特定于以正确方式运行文件的命令行参数,那么它将不起作用。话虽如此,Dir.pwd而且requireing 似乎可以正常工作,只要您从与文件相同的目录中执行命令。

于 2018-07-19T05:24:25.330 回答