Mike Harris
9/28/2006 2:04:00 PM
Robert Klemme wrote:
> Mike Harris <GENIE@prodigy.net> wrote:
>
>> Also, with #2, obviously your way works, but the &&= isn't neccesary,
>> a && has the intended effect, since the result of the block is put in
>> the accumulator. Again, it doesn't matter at all, I'm mostly just
>> writing to avoid doing work.
>
>
> In that case order should be reversed to avoid short circuiting
> altogether (in this case it does not matter as the test has no side
> effects, but if it had...)
>
>>> (1..5).inject(true) { |retval, i| puts i; i < 3 && retval}
>>
> 1
> 2
> 3
> 4
> 5
> => false
>
> Kind regards
>
> robert
>
>
>
>
Very good point, neglected to think about that, glossing over the fact
that the puts executing doesn't mean the relevant expression evaluated.
With the fixed example:
irb(main):001:0> (1..5).inject(true) { |s,i| s &&= (puts i; i < 3) }
1
2
3
=> false
irb(main):002:0> (1..5).inject(true) { |s,i| s && (puts i; i < 3) }
1
2
3
=> false
irb(main):003:0> (1..5).inject(true) { |s,i| (puts i; i < 3) && s }
1
2
3
4
5
=> false
With the &&= vs && thing, I made a salient point about a bug in the
example and I was too dumb to realize it.