Ruby中的“python -i”等效

时间:2012-12-25 11:27:55

标签: ruby

我读过这个问题,但这并没有回答。 Is there a ruby equivalent of "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定义为global时才有效。所以,它实际上不是“python -i”的等价物。

那么,究竟是什么呢?

2 个答案:

答案 0 :(得分:5)

根据Kernel#load documentation,

  

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

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

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

$ irb -r main.rb

     

&GT; Wtf.hello

     

&GT; &#34;世界&#34;

答案 1 :(得分:1)

所以事实证明,实际上有一种邪恶的骇人方式:

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

(需要pry宝石)

说明:

<( ... )是一个Bash process substitution,可以有效地制作一个管道,其中包含对表达式进行求值的结果,然后可以将其括在圆括号中,Ruby可以对其进行求值。

echo "$(cat main.rb)\nbinding.pry"输出文件的内容(在本例中为main.rb),并添加换行符和Ruby代码binding.pry,将其与{{1}组合使用将requirepry一起使用将启用Pry的runtime invocation,它将整个程序的状态公开给交互式调试器。

示例:

(使用上方的-rpry

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似乎正常工作。