Ruby触发器什么时候有用?

kaj*_*aco 20 ruby flip-flop

我想通过教程我理解触发器是如何工作的,但是这个例子只是为了教学而设计的.任何人都可以举例说明你实际使用或使用触发器的方法吗?

我正在寻找一个真实的应用程序,而不仅仅是另一个演示.这个工具可以解决什么问题?

以前的链接http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators,但这几天似乎是垃圾邮件.

Jam*_*son 20

这是一个示例(取自rubycentral.com文章),您只打印文件中的某些行:

file = File.open("ordinal")
while file.gets
    print if ($_ =~ /third/) .. ($_ =~ /fifth/)
end
Run Code Online (Sandbox Code Playgroud)

这假设您有一个包含以下内容的文件:

first
second
third
fourth
fifth
sixth
Run Code Online (Sandbox Code Playgroud)

该程序只会打印出来:

third
fourth
fifth
Run Code Online (Sandbox Code Playgroud)

我们的想法是,在左手事件发生之前,值才为真,然后在右手事件发生之前保持为真.如果使用得当,这可能是一个很好的语法糖,但你需要小心,使事情可读.

  • 忘记大约3和5.它是关于提取由开始标记和结束标记分隔的文件的一部分.我希望你能更好地看到为什么这是一个真实世界的例子.现在等效的非触发器版本将涉及为状态添加变量,更多if语句:更复杂的代码. (4认同)
  • ......这不是一个范围.你完全误解了触发器操作符.它是同一段语法,恰好在这种情况下意味着完全不同的东西.(没有人说过Ruby的语法很简单:http://j.mp/cu0eFz - 那是非常不完整的!) (3认同)
  • -1:未经测试的代码.你觉得这是什么,perl?你需要`print if($ _ =〜/ third /)..($ _ =〜/ 5th /)`(我知道这不是你的代码,但是不需要继续传播使用弃用功能的代码). (2认同)

小智 8

我想用一些具体的例子来补充詹姆斯的回答.我已经使用此运算符根据正则表达式提取文本部分.

我正在编写一个工具,涉及通过Net :: SSH在远程服务器上运行命令.无论会话是否是登录会话,这个特定服务器都有打印MOTD的烦人习惯.当我运行命令并检索输出时,这导致了大量垃圾回收.由于我在服务器设置中没有太多影响,我创建了一个小脚本,打印出分隔符,运行程序,然后打印另一个分隔符.输出看起来像这样.

Welcome to Server X!

+----------------------------------------------------------------------+
| Use of this server is restricted to authorized users only. User      |
| activity may be monitored and disclosed to law enforcement personnel |
| if any possible criminal activity is detected.                       |
+----------------------------------------------------------------------+

----------------------------------------------
    Setting up environment for user Adam. 
----------------------------------------------

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<
Run Code Online (Sandbox Code Playgroud)

触发器操作符是一个有用的快捷方式,可以使用我需要的输出来提取代码段.我使用了匹配25个大型">"的正则表达式来开始比赛,并且使用了25个较少的"<"来结束比赛.

output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] }
Run Code Online (Sandbox Code Playgroud)

产量

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<
Run Code Online (Sandbox Code Playgroud)

我见过的大多数例子都涉及从基于正则表达式的文件或数组中提取数据块.想到的其他一些例子是从旧的平面文件系统(如编译到文件的结构)和日志文件中提取git合并冲突,某些记录.

基本上,任何时候你需要根据开始和结束数据而不仅仅是单个行的内容来提取部分.它比一个简单的正则表达式复杂一点,但比编写解析器复杂一点.