2013-01-18 22 views
0

我读到这样一些代码:做什么类这种方法(读取)来自(开URI红宝石)

source = URI.join(uri).read 

这基本上进入到URI,并存储在变量中的网页的源代码。

我在IRB试过这样:

URI.join(uri).class 

,并返回URI::HTTP,但是,当我试图URI.join(uri).read.class => String

我检查了String类,但没有read方法。

我想存根这种方法,但我不能够,因为我不知道它来自哪里。

回答

1

read来自Ruby的StringIO模块,它的作用类似于普通的IO类。

OpenURI 通过StringIO类,这是它如何愚弄我们,我们的代码,认为URL是我们可以读取的设备。

URI.join(uri).read.class返回String,因为页面是从URL指向的站点读取的,而内容是一个字符串。 OpenURI覆盖URI类并将read添加到它。如果你尝试:

require 'uri' 
URI.join('http://example.com').read 

,而不必要求OpenURI,你会因为本身URI不知道如何read得到一个错误。

URI.join('http://example.com') 
=> #<URI::HTTP:0x0000010292de68 URL:http://example.com> 

URI.join('http://example.com').read 
NoMethodError: undefined method `read' for #<URI::HTTP:0x0000010218b3b8 URL:http://example.com> 
+0

啊。感谢那。说得通。顺便说一句,有什么办法可以存根这个读取返回我想要的? – noMAD

+0

你想覆盖OpenURI的'read'?为什么?为什么不把子类OpenURI覆盖并在你的子类中覆盖它,这样你就不会混淆其他可能需要使用OpenURI.read的东西? –

+0

那么,我的StubClass应该有OpenURI的名字?如果我做了StubClass noMAD