【问题标题】:When would a Ruby flip-flop be useful?Ruby 触发器什么时候有用?
【发布时间】:2016-10-13 02:33:47
【问题描述】:

感谢教程,我想我理解了人字拖的工作原理,但那里的示例只是为了教学而设计的。谁能举例说明您实际使用或将如何使用人字拖?

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

以前的链接是http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators,但现在好像是垃圾邮件。

【问题讨论】:

    标签: ruby flip-flop


    【解决方案1】:

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

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

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

    first
    second
    third
    fourth
    fifth
    sixth
    

    程序只会打印出来:

    third
    fourth
    fifth
    

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

    【讨论】:

    • -1:未经测试的代码。你认为这是什么,perl?你需要print if ($_ =~ /third/) .. ($_ =~ /fifth/)(我知道这不是你的代码,但没有必要继续传播使用过时功能的代码)。
    • 这个的实际用途是什么?我什么时候需要打印文件中的第 3 行到第 5 行(足够的时间让它值得编码)?
    • 忘记 3 和 5。这是关于提取由开始标记和结束标记分隔的文件部分。我希望你能更好地理解为什么这是一个真实世界的例子。现在等效的非触发器版本将涉及为状态添加变量,更多 if 语句:只是更复杂的代码。
    • 哇,现在我看到我的 ruby​​ 的面向对象特性如此强大......以这样的方式使用范围。太棒了!
    • ……这不是一个范围。您完全误解了触发器运算符。这是相同的语法,在这种情况下恰好意味着完全不同的东西。 (没有人说过 Ruby 的语法很简单:j.mp/cu0eFz - 这是非常不完整的!)
    【解决方案2】:

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

    我正在编写一个工具,该工具涉及通过 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
    <<<<<<<<<<<<<<<<<<<<<<<<<
    

    触发器操作符是一个有用的快捷方式,可以只提取包含我需要的输出的代码部分。我使用匹配 25 个大于“>”的正则表达式开始匹配,使用 25 个小于“

    output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] }
    

    输出

    >>>>>>>>>>>>>>>>>>>>>>>>>
    Program Output
    <<<<<<<<<<<<<<<<<<<<<<<<<
    

    我见过的大多数示例都涉及基于正则表达式从文件或数组中提取数据块。想到的其他一些示例包括 git 合并冲突、遗留平面文件系统中的某些记录(如写入文件的结构)和日志文件。

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

    【讨论】:

      【解决方案3】:

      在具有多行的 HTML 表格中突出显示奇数/偶数行似乎是一个有效的用例。

      过去在 Rails 中渲染表格时,我写过几次不如上述优雅的东西。

      【讨论】:

        猜你喜欢
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多