'if not or' not working in Ruby -
i have code in ruby:
if @pass.nil? badpass(@nick) elsif not clt.correctpassword?(@nick, @pass) badpass(@nick)
i wanted condense single line tried writing as:
if not clt.correctpassword?(@nick, @pass) or @pass.nil? badpass(@nick)
but badpass(@nick)
doesn't triggered either cases, whereas works in both cases in top example.
why happen?
in revised code tests in opposite order original. it's if had written:
if not clt.correctpassword?( @nick, @pass ) badpass( @nick ) elsif @pass.nil? badpass( @nick ) end
put tests in same order original , work original:
if @pass.nil? or not clt.correctpassword?( @nick, @pass ) badpass( @nick ) end
remember ruby, many other languages, uses short circuit evaluation logical operators and
, or
, &&
, ||
. means evaluates expression left of operator first, , evaluates expression right of operator if needs to.
btw, many rubyists write way instead:
badpass( @nick ) if @pass.nil? or not clt.correctpassword?( @nick, @pass )
that same thing; it's matter of style prefer.
if .correctpassword?
method code can modify, nice option add nil test @ beginning of method. in fact, may test nil on both nick
, pass
:
def correctpassword?( nick, pass ) return false if nick.nil? or pass.nil? ... rest of code here ... end
then when call method can use:
if not clt.correctpassword?( @nick, @pass ) badpass( @nick ) end
or simple code:
badpass( @nick ) unless clt.correctpassword?( @nick, @pass )
Comments
Post a Comment