Быстрый совет: как это должно быть написано на Ruby? - PullRequest
7 голосов
/ 22 января 2010

Я программист на Java / C ++, а Ruby - мой первый язык сценариев. Иногда я обнаруживаю, что использую его не так продуктивно, как в некоторых областях, например, например:

Цель: проанализировать только определенные строки из файла. Шаблон, который я использую, состоит в том, что есть одна очень большая линия размером больше 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

Я написал это, но я думаю, что это могло бы быть написано намного лучше, то есть должен быть лучший способ, чем установка флага. Рекомендации по написанию красивых строк на Ruby также приветствуются.

Примечание / Уточнение: Мне нужно напечатать ВСЕ строки ПОСЛЕ первого появления БОЛЬШОЙ ЛИНИИ.

Ответы [ 3 ]

10 голосов
/ 22 января 2010
str.lines.drop_while {|l| l.length < 15 }.drop(1).each {|l| do_something(l) }

Мне это нравится, потому что если вы читаете его слева направо, оно читается почти так же, как ваше первоначальное описание:

Разбить строку на строки и отбросить строки короче 15 символов. Затем добавьте еще одну строку (т.е. первую, содержащую более 14 символов). Затем сделайте что-нибудь с каждой оставшейся строкой.

Вам даже не нужно обязательно понимать Ruby или программировать на всех , чтобы убедиться, что это правильно.

3 голосов
/ 22 января 2010
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
1 голос
/ 22 января 2010
lines = str.split($/)
start_index = 1 + lines.find_index {|l| l.size > 15 }
lines[start_index..-1].each do |l|
  do_something(l)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...