Ruby Range in Boolean expressions

以下技术应用于最优质的水果的鲜果篮

Copy from:     http://www.sitepoint.com/forums/showthread.php?402694-Ranges-in-Boolean-Expressions


Ruby maintains the true/false state of the boolean expression when using a range... it switches back and forth between the start and end value of the range with each state change. I think it's easiest to explain by stepping through the process using the example below: 


Code:
a = (11..20).collect {|i| (i%4 == 0)...(i%3 == 0) ? i : nil}  
a  » [nil, 12, 13, 14, 15, 16, 17, 18, nil, 20]
The initial state of the boolean expression is false.
We start by passing the value 11 into the code block:

11 is passed in, (11%4 == 0) is False, so the state does not change... it remains false, so nil is returned.
12 is passed in, (12%4 == 0) is True, so the state CHANGES to true.. the value of 'i' is returned

Since the state has now changed, ruby switches to the end value in our range when evaluating the boolean expression

13 is passed in, now we use the end expression of the range: (i%3 == 0). Since (13%3 == 0) is False, no change is made to the state. However, Ruby remembers that the state was ALREADY true, so it STILL treats it as true, and returns the value of 'i' 


14 is passed in, (14%3 == 0) is false, so again, no state change. The boolean is still considered true, and the value of i is returned

15 is passed in, (15%3 == 0) is True, so the state changes (since it was already true, it now changes to false). Ruby still returns the value of i before completing the loop. However, on the next iteration, it switches back to the first expression in the range - (i%4 == 0)

16 is passed in, (16%4 == 0) is True also, so the state changes yet again (it was false, so now it's back to true!) the value of i is returned and again we switch to the end value of our range when evaluating the next iteration

and so it goes... flipping back and forth between the start and end value of the range with each state change



When you use the 2 dot range in a boolean expression, ruby will test the start and end value of the range during the SAME iteration IF the first expression of the range returns true... phew... so in effect it changes state twice in one iteration, while the 3 dot range I used above can only change state once with each iteration.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值