Возвращает результат блока, переданного в #scan во время регулярного выражения - PullRequest
1 голос
/ 11 апреля 2010

Я искал и не смог найти правильный способ сделать то, что я пытаюсь. Я читаю файл построчно и хочу создать новый объект из регулярного выражения в каждой строке. Я не использую синтаксический анализатор XML, потому что данные плохо сформированы и перечислены ниже - это все, что мне нужно получить из каждой строки.

Я не могу получить сканирование, чтобы вернуть результат блока. Он просто возвращает исходную строку. Я временно справился с этим, создав переменную temp, но я уверен, что есть лучший способ.

enum = File.foreach(filename)  

enum.map do |line|
   temp = nil
   line.scan(/<cab id="(\w+)" updates="(\d+)"/) { |a,b| temp = Cab.new(a,b) }
   temp
end

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2010

скан + карта может быть?

line.scan(/<cab id="(\w+)" updates="(\d+)"/).map { |a,b| Cab.new(a,b) }
0 голосов
/ 11 апреля 2010

Я бы сделал:

enum.map {|line| Cab.new(*line.match(/<cab id="(\w+)" updates="(\d+)"/)[1,2]) }

или, если бы я хотел, чтобы он был более читабельным:

enum.map {|line|
  line =~ /<cab id="(\w+)" updates="(\d+)"/
  Cab.new($1, $2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...