Ruby:空字符串和空字符串,有什么区别?

时间:2016-06-28 07:03:52

标签: ruby-on-rails ruby

新手问题,我在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会产生不同的结果。

  1. $5和空字符串有什么区别?
  2. 从ruby程序员的角度来看,这个问题的正确解决方法是什么?

1 个答案:

答案 0 :(得分:1)

如果没有匹配,$5变为nil,而不是空字符串。您在记录器中看到的是nil.to_s,显然是一个空字符串。

但是在options中,nil和空字符串具有不同的含义。 nil表示“没有端口集”,而空字符串表示“端口设置为空字符串”,结果类似于:

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

这使整个事情失败。