代码之家  ›  专栏  ›  技术社区  ›  Zombies

快速建议:这应该如何用Ruby编写?

  •  7
  • Zombies  · 技术社区  · 15 年前

    我是一个爪哇/ C++程序员,露比是我的第一个脚本语言。我有时会发现,在某些领域,我并没有尽可能地高效地使用它,例如:

    目标:只解析文件中的某些行。我要说的模式是有一条非常大的线,尺寸大于15,其余的线肯定更小。我想忽略前面(包括前面)的所有行。

    def do_something(str)
       puts str
    end
    
    
    str = 
    'ignore me
    me too!
    LARGE LINE ahahahahha its a line!
    target1
    target2
    target3'
    
    flag1 = nil
    str.each_line do |line|
      do_something(line) if flag1
      flag1 = 1 if line.size > 15
    end
    

    我写了这篇文章,但我认为它可以写得更好,也就是说,一定有比设置旗帜更好的方法。建议如何写漂亮的红宝石线条也欢迎。

    注释/澄清: 我需要在第一次出现大行后打印所有行。

    3 回复  |  直到 15 年前
        1
  •  10
  •   Jörg W Mittag    15 年前
    str.lines.drop_while {|l| l.length < 15 }.drop(1).each {|l| do_something(l) }
    

    我喜欢这个,因为如果你从左到右读,它读起来几乎和你最初的描述完全一样:

    将字符串拆分为多行,并删除少于15个字符的行。然后再放一行(即第一行超过14个字符)。然后对剩下的每一行做一些事情。

    您甚至不需要理解Ruby或编程 完全 以验证这是否正确。

        2
  •  3
  •   Farrel    15 年前
    require 'enumerator' # Not needed in Ruby 1.9
    
    str.each_line.inject( false ) do |flag, line|
      do_something( line ) if flag
      flag || line.size > 15
    end
    
        3
  •  1
  •   mckeed    15 年前
    lines = str.split($/)
    start_index = 1 + lines.find_index {|l| l.size > 15 }
    lines[start_index..-1].each do |l|
      do_something(l)
    end