我正在尝试使用Pry编辑我的Ruby文件。它中设置的变量很少,无论出于何种原因,我似乎无法cd
进入它们,因为即使在我'加载'文件后它们也没有被定义。
以下是代码:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri.XML('<foo><bar /><foo>', nil, 'UTF-8')
url = "http://superbook.eventmarketer.com/category/agencies/"
puts "Finished!"
在Pry我做:
load "./AgencyListingScraper.rb"
然后这是输出:
7] pry(main)> load './AgencyListingScraper.rb'
Finished!
=> true
[8] pry(main)>
然后当我尝试做类似的事情时:
[8] pry(main)> url
NameError: undefined local variable or method `url' for main:Object
from (pry):6:in `__pry__'
[9] pry(main)> cd url
Error: Bad object path: url. Failed trying to resolve: url. #<NameError: undefined local
variable or method `url' for main:Object>
[10] pry(main)>
这就是我得到的。
我认为我没有正确加载文件,虽然我已经搜索了几个小时但我无法弄清楚如何正确地执行此操作。几个月前,当我用Ruby制作刮刀时,我就是这么做的,但这次我因为这一点而难以入手。
提前感谢您的帮助!
答案 0 :(得分:10)
以这种方式尝试:
在您的文件中包含Pry并执行binding.pry
:
require 'nokogiri'
require 'open-uri'
require 'pry'
doc = Nokogiri.XML('<foo><bar /><foo>', nil, 'UTF-8')
url = "http://superbook.eventmarketer.com/category/agencies/"
binding.pry
puts "Finished!"
然后执行以下命令运行该文件:
ruby AgencyListingScraper.rb
那会让你进入一个Pry会话,在那里你可以使用像ls
这样的命令来查看所有的变量。
你使用Pry的方式和这种方式都有效。但是,load
在您的情况下可能不起作用的原因是局部变量不会跨文件转移,例如当您需要另一个文件时。
尝试加载此文件:
#test.rb
y = "i dont get carried over cause i am a local variable"
b= "i dont get carried over cause i am a local variable"
AAA= "i am a constant so i carry over"
@per = "i am an instance var so i get carried over as well"
使用load "test.rb"
在Pry中加载时,您可以看到无法访问该文件中的本地变量。
答案 1 :(得分:2)
我找到了这个问题,但是提出的解决方案对我不起作用,因为我要加载的文件不是类也不是脚本,而是复杂的ruby config文件,因此我无法在代码中注入撬动。
但是我也在Reddit中找到了一个与this gist链接的答案,这正是我想要的。
做
Pry.toplevel_binding.eval File.read("stuff.rb")
将在当前的撬动会话中有效地执行文件stuff.rb
的ruby代码,将结果对象留待检查。