Ruby:检查对象是否为零

Som*_*ody 8 ruby

  def parse( line )
    _, remote_addr, status, request, size, referrer, http_user_agent, http_x_forwarded_for = /^([^\s]+) - (\d+) \"(.+)\" (\d+) \"(.*)\" \"([^\"]*)\" \"(.*)\"/.match(line).to_a

    print line
    print request
    if request && request != nil
      _, referrer_host, referrer_url = /^http[s]?:\/\/([^\/]+)(\/.*)/.match(referrer).to_a if referrer
      method, full_url, _ = request.split(' ')

in parse: private method 'split' called for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

所以据我所知,它split不是在字符串上调用,而是在调用nil.这部分是解析Web服务器日志.但我无法理解为什么会这样nil.据我所知,它是空的.

正则表达式中的一些子模式失败了吗?所以这是网络服务器的错,有时会生成错误的日志字符串?

顺便问一下,如何在ruby中写入文件?我无法在Windows下的这个cmd窗口中正确阅读.

Chr*_*nch 19

你似乎在这里有几个问题,所以我会尝试一下似乎是主要问题:

如果你想看看某些东西是否为零,那么只需使用.nil?- 所以在你的例子中,你可以说request.nil?,true如果它是nil,那么它会返回false.


use*_*951 5

Ruby 2.3.0 添加了一个安全导航运算符( &.),用于nil在调用方法之前进行检查。

request&.split(' ')
Run Code Online (Sandbox Code Playgroud)

这在语义上或多或少等价于

!request.nil? && request.split(' ')
Run Code Online (Sandbox Code Playgroud)