0

ruby-1.9.3-p194 导轨 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 是评估结果 = data == params[:captcha].delete(" ").upcase

但为什么???
数据'SHGHGD'
params[:captcha].delete(" ").upcaseWEWE

为什么是零?它一定是假的。

4

1 回答 1

1

这实际上是因为记录器 -Logger.debug false输出为零。要了解为什么需要查看记录器类 (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

message 将为 nil,progname 将是您传递的值(即字符串)。关键是progname ||= @progname。因为 progname 是false,它被 的值覆盖@progname,它是 nil ,所以这就是输出。

于 2012-09-28T09:37:01.957 回答