Rails 3条件表达式返回nil是否有问题?

时间:2012-09-28 08:32:40

标签: ruby-on-rails ruby ruby-on-rails-3

红宝石1.9.3-P194 Rails 3.0.9

我遇到了很多条件表达式评估的奇怪行为 看一段代码:

module SimpleCaptcha
  module ControllerHelpers
    def simple_captcha_valid?

      t = Logger.new(STDOUT)

      return true if Rails.env.test?

      if params[:captcha]
        data = 'SHGHGD'
        result = data == params[:captcha].delete(" ").upcase

        t.debug data
        t.debug params[:captcha].delete(" ").upcase
        t.debug result

      else
        return false
      end
    end
  end
end

以下是我在调试控制台中看到的内容:

SHGHGD
WEWE
nil

正如你所看到的,nil是评估的结果 result = data == params [:captcha] .delete(“”).upcase

但为什么??? 数据'SHGHGD'
params [:captcha] .delete(“”).upcase WEWE

为什么没有?它一定是假的。

1 个答案:

答案 0 :(得分:1)

这实际上是因为记录器 - Logger.debug false输出为零。要了解为什么需要查看logger类(logger.rb)。调试,信息,警告等方法最终都会调用

def add(severity, message = nil, progname = nil, &block)
  severity ||= UNKNOWN
  if @logdev.nil? or severity < @level
    return true
  end
  progname ||= @progname
  if message.nil?
    if block_given?
      message = yield
    else
      message = progname
      progname = @progname
    end
  end
end

并且消息将为nil,progname将是您传递的值(即字符串)。 keyline是progname ||= @progname。因为progname是false,所以它被@progname的值覆盖,它是nil,因此输出的是。