Ruby中的"python -i"等价物

3
我看到了这个问题,但它并没有回答它。有没有一个ruby等价于“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”。
那么,确切的等价物是什么?

我认为这在 Ruby 中无法完成。局部变量不会以这种方式变成全局变量。 - halfelf
2个回答

5
根据Kernel#load文档, 在任何情况下,加载文件中的局部变量都不会传播到加载环境。 如果您不喜欢全局变量或常量,一种方法是将数据封装在模块中,例如:main.rb:
module Wtf
  @hello= "world"
  def self.hello; @hello end
end

$ irb -r main.rb

> Wtf.hello

> "world"


我尝试使用eval File.read('main.rb'), binding进行黑客攻击,但显然Ruby不允许在任何情况下加载局部变量,就像Kernel#load文档所说的那样。 此外,请参见此帖子末尾Matz(Ruby的创建者)的回复 - nurettin

1
所以事实证明,实际上有一种邪恶的黑客方式可以做到这一点:
ruby -rpry <(echo "$(cat main.rb)\nbinding.pry")

(需要 pry gem)

Explanation:

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

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

Example:

(使用上面的 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.pwdrequire似乎可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接