Если регулярное выражение Ruby сопоставляется с чем-то, что не является строкой, то метод to_str
вызывается для этого объекта, чтобы получить фактическую строку, для которой она соответствует. Я хочу избежать такого поведения; Я хотел бы сопоставлять регулярные выражения с объектами, которые не являются строками, но могут быть логически рассмотрены как беспорядочно доступные последовательности байтов, и все обращения к ним опосредуются с помощью метода byte_at()
(аналогично духу метода Java CharSequence.char_at()
).Согласование регулярных выражений с нестроками в Ruby без преобразования
Например, предположим, что я хочу найти смещение байта в произвольном файле произвольного регулярного выражения; выражение может быть многострочным, поэтому я не могу просто читать строку за раз и искать совпадение в каждой строке. Если файл очень большой, я не могу вместить его все в память, поэтому я не могу просто прочитать его как одну большую строку. Однако было бы достаточно просто определить метод, который получает n-й байт файла (с буферизацией и кешированием, если необходимо для скорости).
В конце концов, я хотел бы создать полнофункциональный класс rope, например, в Ruby Quiz #137, и я хотел бы иметь возможность использовать регулярные выражения для них без потери производительности при преобразовании их в строки.
Я не хочу подниматься на локти во внутренности реализации регулярного выражения Ruby, поэтому любое понимание будет оценено по достоинству.
Когда вы читаете, что вслух это звучит как хорошая идея? –
Я согласен с тем, что я, вероятно, не буду реализовывать первый пример в Ruby, но я думаю, что иметь регулярный интерфейс выражения для non-strings - хорошая идея. – Bkkbrad