Hi, all. I was fixing a bug last night, and discovered some
"gotcha"-like behaviour in the process. Consider:
irb(main):173:0> s = "my string"
=> "my string"
irb(main):174:0> r1 = /my/
=> /my/
irb(main):175:0> r2 = /your/
=> /your/
irb(main):176:0> r3 = nil
=> nil
irb(main):177:0> s =~ r1
=> 0
irb(main):178:0> s =~ r2
=> nil
irb(main):179:0> s =~ r3
=> false
s =~ r1 .... That's cool, it gives me the index of the match.
s =~ r2 .... That's cool, it tells me there was no match.
s =~ r3 .... Whoa.
The reason this "got me" is that I had this code:
match_result = ( some_string =~ some_regexp )
if match_result != nil
# Assume there was a match
end
But the problem is... I had an s =~ r3 case because some_regexp was nil,
and so it was entering my if block when I semantically did not want that
to occur. 
So now my code is
if match_result != nil and match_result != false
...
end
Note also that I can't even use Regexp.last_match != nil in my if block:
irb(main):224:0> s =~ r2
=> nil
irb(main):225:0> Regexp.last_match
=> nil
irb(main):226:0> s =~ r3
=> false
irb(main):227:0> Regexp.last_match
=> nil
irb(main):228:0> s =~ r1
=> 0
irb(main):229:0> Regexp.last_match
=> #<MatchData:0x406c40b4>
irb(main):230:0> s =~ r3
=> false
irb(main):231:0> Regexp.last_match
=> #<MatchData:0x406c40b4>
To be clear: Note how a "nil type" of non-match overwrites last_match,
but a "false type" of non-match doesn't.
So the question is... why are BOTH nil and false possible return values
of =~ ? Is there some benefit to this? Why not just one or the other?
I see that this behaviour is [documented][1] but I still feel that this
is unintuitive behaviour when people assume =~ only applies to Regexp
RHS's.
[1]: http://www.ruby-doc.org/core/classes/String.html#M001453
Thanks in advance for any and all clarifications and explanations.
Pistos
···
--
Posted via http://www.ruby-forum.com/.