0

ruby-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は評価結果= data == params [:captcha] .delete( "").upcaseの結果です。

しかし、なぜ???
データ'SHGHGD'params
[:captcha] .delete( "").upcaseWEWEです

なぜゼロなのか?それは偽でなければなりません。

4

1 に答える 1

1

これは実際にはロガーが原因です-nilをLogger.debug false出力します。ロガークラス(logger.rb)を調べる必要がある理由を理解するため。debug、info、warnなどのメソッドはすべて呼び出します

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は渡した値(つまり文字列)になります。キーラインはprogname ||= @prognameです。prognameは、であるため、値nilでfalse上書きされ、出力されます。@progname

于 2012-09-28T09:37:01.957 に答える