2012-09-28 13 views
0

ruby​​-1.9.3-p194 Rails 3.0.9Rails 3条件表达式retirns nil是否有问题?

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

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 

正如你可以看到零是评估结果的结果=数据== PARAMS [: captcha] .delete(“”).upcase

但是为什么?
数据'SHGHGD'
PARAMS [:验证码] .delete(”“).upcaseWEWE

为什么零?它一定是错误的。

+0

如果您尝试't.debug result.to_s'确实有效吗? –

+0

t.debug result.to_s按照我的预期返回false,但false是StringClass的实例,但不是FalseClass。 –

+2

FalseClass.to_s应该返回StringClass“false”,NilClass.to_s应该返回一个空的StringClass“”。在这里试试你的场景,看看结果是否相同:http://tryruby.org –

回答

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 

和消息将是零,将progname会(即一个字符串)你传递的值。角线是progname ||= @progname。因为程序名是false,所以它被覆盖的值为​​,这是零,所以得到输出。

+0

非常感谢您的帮助。现在很明显。 –