新手问题,我在ruby应用程序中尝试调试bug, 你可以看到它here。
代码:
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
会产生不同的结果。
$5
和空字符串有什么区别? 答案 0 :(得分:1)
如果没有匹配,$5
变为nil
,而不是空字符串。您在记录器中看到的是nil.to_s
,显然是一个空字符串。
但是在options
中,nil
和空字符串具有不同的含义。 nil
表示“没有端口集”,而空字符串表示“端口设置为空字符串”,结果类似于:
# ⇓⇓ here is empty port!
http://example.com:/path
这使整个事情失败。