红宝石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
为什么没有?它一定是假的。
答案 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,因此输出的是。