凝望长空 发表于 2011-11-18 16:26

flip-flop

flip-flop




今天学习到的一种比较新的,挺有趣的特性,说新只是以前学JAVA和PHP的时候木有接触过。貌似Ruby的这一特性是从Perl那里继承而来,所以学习过Perl的程序员应该比较熟悉。
   flip-flop
以下内容摘自《Ruby编程语言》
   当..和...操作符被用在一个条件式,或者一个循环中时,它们不会创建Range对象。相反地,它们将创建一种特殊的布尔表达式,名为flip-flop.和比较以及相等表达式一样,一个flip-flop表达式的值也为true或者false。但是一个flip-flop表达式的特殊之处在于,它的值依赖于此前的求值结果,这就意味着flip-flop表达式具有与其关联的状态,所以你可能会认为一个flip-flop是一个某种类型的对象,但事实上flip-flop并不是对象,而是Ruby表达式。Ruby解释器在处理完一个flip-flop表达式之后,将为它在内部存储一个解析后的表现形式,其中就保存了该表达式的状态(只是作为一个布尔值)。
有了这些背景知识后,请看下面代码中的flip-flop。第一个..创建一个Range对象,第二个..则创建了一个flip-flop表达式:
               (1..10).each {|x| print x if x==3..x==5 }
    在一个由条件式或者循环所构成的上下文中,一个flip-flop由两个通过..操作符相连的布尔表达式构成。除非其左侧表达式为true,否则一个flip-flop表达式就位false,而且在左侧表达式为true之前,它的值都会是false。一旦该表达式为true那么它就会“flips”到一个持久的true状态。它会保持该状态,而且对其后续的求值也返回true,直到其右侧的表达式为true为止。如果右侧表达式为 true了那么该flip-flop就会“flops”回一个持久的false状态,对其后续的求值也返回false,直到其左侧表达式再次成为true为止。
    在上面的代码例子中,该flip-flop被反复求值,相应的x的值也从1增加到10.起初,它的状态为false,而且在x等1和2的时候一直是false。当x等于3的时候,该flip-flop的状态就成为true。在x等于4和5的时候,该flip-flop的状态又回到了false,而且对于后续的x,它总是返回false。上述代码的执行结果是打印出345 。
    可以使用..或...来编写flip-flop。起差别在于:当一个..flip-flop为true时,它会返回true,同时测试它的右侧表达式以决定是否需要将其内部状态设置回false;而对于...flip-flop来说,它等到下一次求值的时候才测试其右侧表达式。观察下面的代码:# Prints "3".Flips and flops backwhen x==3
(1..10).each {|x| print x if x==3..x>=3}
# Print "34" .   Flis when x==3 and flops when x==4
(1..10).each {|x| print x if x==3...x>=3}注:flip-flop其中一个意思是突变,flip和flop都有翻转的意思

2gua 发表于 2011-11-19 04:30

:em51:好文。

gr33n 发表于 2011-11-19 23:57

挺有趣的特性

x9x9 发表于 2011-11-22 14:39

Perl也可以这么写,这个说成 flip-flop 有点牵强。严格的说就是满足表达式条件而已吧。perl -e "for (1..10) {print if $_==3..$_==5} ";这和下面的写法是一样的,只是方便书写,Just another way to do it 。(1..10).each {|x| print x if x>=3 and x<=5 }真正的flip-flop应该就是在0和1(或是true或false)之间翻转才对吧。

rubyish 发表于 2011-11-22 16:43

学习到
页: [1]
查看完整版本: flip-flop