2016-06-28 70 views
0

新手問題,我嘗試在ruby應用程序中嘗試調試錯誤, 你可以看到它hereRuby:空字符串和空字符串有什麼不同?

代碼:

def self.default_url_options 
    options = {:protocol => Setting.protocol} 
    if Setting.host_name.to_s =~ /\A(https?\:\/\/)?(.+?)(\:(\d+))?(\/.+)?\z/i 
     host, port, prefix = $2, $4, $5 
     options.merge!({ 
     :host => host, :port => port, :script_name => prefix 
     }) 
    else 
     options[:host] = Setting.host_name 
    end 
    options 
    end 

如果我host, port, prefix = $2, $4, $5後添加日誌記錄:

host, port, prefix = $2, $4, $5 
    Rails.logger.error "!!!!!!! '#{host}', '#{port}', '#{prefix}'" 

我: !!!!!!! 「hostname.net」,「」,「」

所以prefix是空的,但如果設置:script_name明確地'' 改變程序的行爲,我得到預期的結果,在 換句話說:

:script_name => '' 

和空$5給出不同的結果。

  1. $5和空字符串有什麼區別?
  2. 從ruby程序員的角度來看這個問題的正確解決方法是什麼?
+1

空的'$ 5'是指'nil'? – Aleksey

回答

1

當沒有匹配時,$5變成nil,而不是空字符串。您在記錄器中看到的是nil.to_s,顯然它是一個空字符串。

但是在options,nil和空字符串有不同的含義。 nil的意思是「沒有港口集」,而空字符串表示「端口設置爲空字符串」,造成不便,如:

#     ⇓⇓ here is empty port! 
http://example.com:/path 

這使得整個事情失敗。