随笔 - 395  文章 - 3  评论 - 16  阅读 - 32万

读<<programming ruby>> 7.6节 flip-flop 理解

书中源码是这样的

File.foreach('1.txt') do |x|
  if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then
    print x
  end
end

其中 1.txt内容如下

复制代码
first
second
third
fourth
fifth
sixth
seventh
eigth
ninth
tenth
复制代码

按道理 读取第一行的first,$.应该是1 ($.是一个全局变量,表示行号)但是rubymine调式发现不是1,这个我暂时没找到原因。所以经别人提示。我改成这样

1
2
3
4
5
6
7
8
9
10
f = File.new('1.txt')
f.each do |line|
  if ((f.lineno == 1) || line.chomp =~ /eig/)..((f.lineno== 3) || line.chomp =~ /nin/) then
 
 
 
    print f.lineno
    print line
  end
end

  

这样 f.lineno表示每次读取的行号 运行测试结果如下

 

 

书上只提到2点,

1 exp1..expr2这样的rang, 在exp1变为真之前,它的值为假,在exp2变为真正之前,rang被求解为真
2 这段代码片段。就是打印1到3行及位于/eig/和/nin/之间

 

有点晦涩难懂,然后群里有人提示,看这个文章: http://nithinbekal.com/posts/ruby-flip-flop/

The flip flop operator is a range (..) operator used between two conditions in a conditional statement. It looks like this:

1
2
3
(1..20).each do |x|
  puts x if (x == 5) .. (x == 10)
end

 The condition evaluates to false every time it is evaluated until the first part evaluates to true. Then it evaluates to true until the second part evaluates to true. In the above example, the flip-flop is turned on when x == 5 and stays on until x == 10, so the numbers from 5 to 10 are printed.

 

(x == 5) .. (x == 10) 这个东西叫做flip flop 

 

1
 
1
2
3
1 蓝色英文就是说,当第一部分也就是(x==5)为真的时候。整个if判断为真,但是什么时候为假呢。直到第二部分为真也就是(x==10)时候,
  也就是前面提到的 exp1..expr2这样的rang, 在exp1变为真之前,它的值为假,在exp2变为真正之前,rang被求解为真
2  红字英文意思就是 x==5时,这个表达式开始执行。什么时候停止呢,知道x==10,所以打印510之间

  

 

所以理解 

1
((f.lineno == 1) || line.chomp =~ /eig/)..((f.lineno== 3) || line.chomp =~ /nin/)

可以这么想,当f.lineno 值为1的时候 这个表达式 ((f.lineno == 1) || line.chomp =~ /eig/) 为真,整个if 为真,

然后打印 1first,什么时候打印终止?,当flineno=3或者line.chomp(chomp去掉行尾的/r/n)的值匹配/nin/,他们两个满足其中一个的时候 就不打印了。

 

可以像下面代码这样理解

1
2
3
4
5
6
7
f = File.new('1.txt')
f.each do |line|
  if ((1..3).include?f.lineno) or (line =~ /eig/ or line =~ /nin/) then
    print f.lineno
    print line
  end
end

  

posted on   c3tc3tc3t  阅读(286)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示