2009-10-26 4 views
3

Если регулярное выражение Ruby сопоставляется с чем-то, что не является строкой, то метод to_str вызывается для этого объекта, чтобы получить фактическую строку, для которой она соответствует. Я хочу избежать такого поведения; Я хотел бы сопоставлять регулярные выражения с объектами, которые не являются строками, но могут быть логически рассмотрены как беспорядочно доступные последовательности байтов, и все обращения к ним опосредуются с помощью метода byte_at() (аналогично духу метода Java CharSequence.char_at()).Согласование регулярных выражений с нестроками в Ruby без преобразования

Например, предположим, что я хочу найти смещение байта в произвольном файле произвольного регулярного выражения; выражение может быть многострочным, поэтому я не могу просто читать строку за раз и искать совпадение в каждой строке. Если файл очень большой, я не могу вместить его все в память, поэтому я не могу просто прочитать его как одну большую строку. Однако было бы достаточно просто определить метод, который получает n-й байт файла (с буферизацией и кешированием, если необходимо для скорости).

В конце концов, я хотел бы создать полнофункциональный класс rope, например, в Ruby Quiz #137, и я хотел бы иметь возможность использовать регулярные выражения для них без потери производительности при преобразовании их в строки.

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

+1

Когда вы читаете, что вслух это звучит как хорошая идея? –

+0

Я согласен с тем, что я, вероятно, не буду реализовывать первый пример в Ruby, но я думаю, что иметь регулярный интерфейс выражения для non-strings - хорошая идея. – Bkkbrad

ответ

3

Вы не можете. Это не поддерживалось в Ruby 1.8. x, вероятно, потому что это такой кромка края; и в 1.9 это даже не имеет смысла. Ruby 1.9 не привязывает свои строки к байтам любым удобным для пользователя способом; вместо этого он использует коды символов, так что он может поддерживать множество кодировок, которые он принимает. И новый оптимизированный двигатель Regex 1.9, Oniguruma, также построен вокруг той же концепции кодировок и кодовых точек. Байты просто не входят в картину на этом уровне.

У меня есть подозрение, что то, о чем вы просите, является примером преждевременной оптимизации. Для любого разумного объекта Ruby реализация to_str не должна быть огромным препятствием производительности. Если это так, то Ruby, вероятно, является неправильным инструментом для вас, поскольку он абстрагирует и изолирует вас от ваших необработанных данных различными способами.

Ваш пример поиска последовательности байтов в большом двоичном файле не является идеальным вариантом использования для Ruby - вам лучше использовать grep или какой-либо другой инструмент Unix. Если вам нужны результаты в вашей программе Ruby, запустите ее как системный процесс с использованием обратных шагов и обработайте вывод.

+0

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

Смежные вопросы