2017-04-25 78 views
0

我使用ruby URI來構建一個基本的uri,而且我對某些東西感到困惑。爲什麼我不能使用鏟運算符來設置uri.query?

這裏是我的代碼:

uri = URI("https://myhost.com") 
uri.path << "/myapi/endpoint" 
uri.query = "p1=value1&p2=value2" 

uri.to_s 
=> "https://myhost.com/myapi/endpoint?p1=value1&p2=value2" 

這是一切都很好,但我不明白爲什麼我可以使用<<操作員設置uri.path但不uri.query

例如,後續代碼不會設置uri.query

uri = URI("https://myhost.com") 
uri.path << "/myapi/endpoint" 
uri.query << "p1=value1&p2=value2" 

回答

1

因爲傳遞給構造解析URL沒有查詢,所以它是零,路徑創建爲空字符串工作。將查詢設置爲空字符串將允許這樣做。

這只是一個例子,因爲有比鏟運營商更好的設置方法。

irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> uri = URI('http://example.com') 
=> #<URI::HTTP http://example.com> 
irb(main):003:0> uri.path 
=> "" 
irb(main):004:0> uri.query 
=> nil 
irb(main):005:0> uri.query = "" 
=> "" 
irb(main):006:0> uri.query << 'p1=value1&p2=value2' 
=> "p1=value1&p2=value2" 
irb(main):007:0> uri 
=> #<URI::HTTP http://example.com?p1=value1&p2=value2> 

更好:

irb(main):011:0> uri.query =+ 'p1=value1&p2=value2' 
=> "p1=value1&p2=value2" 
irb(main):012:0> uri 
=> #<URI::HTTP http://example.com?p1=value1&p2=value2> 
+0

感謝您的詳細解釋。這對我來說現在是有意義的。我想我忽略了'<<'運算符用於字符串連接的事實,所以它有意義,它不會在'nil'上工作。 – sanpaco

1

因爲nil並不<<迴應,uri.querynil默認。

uri = URI("https://myhost.com") 
# => #<URI::HTTPS https://myhost.com> 
uri.query 
# => nil 
nil.respond_to? :<< 
# => false 
uri.path 
# => "" 
"".respond_to? :<< 
# => true 

注意uri.path是默認爲空字符串。當完整URI加入時,路徑實際上變爲/,這就是爲什麼URL末尾有斜線:您在主機服務器上請求根路徑。

相關問題