class Prism::CodeUnitsCache
Кэш, который можно использовать для быстрого вычисления смещений в единицах кода по смещениям в байтах. Он намеренно предоставляет только один метод [] для доступа к кэшу, чтобы свести к минимуму его интерфейс.
Обратите внимание, что здесь есть несколько известных проблем, которые могут быть устранены в будущем, а могут и нет:
-
Первая проблема возникает, когда кэш вычисляет значения, не соответствующие границам символов. Из-за этого последующие вычисления могут смещаться на одну или несколько единиц кода.
-
Вторая проблема заключается в том, что размер этого кэша в настоящее время не ограничен. Теоретически можно было бы добавить кэш LRU, чтобы ограничить количество записей, но такая возможность пока не реализована.
Открытые методы класса
# File lib/prism/parse_result.rb, line 216
def initialize(source, encoding)
@source = source
@counter =
if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE
UTF16Counter.new(source, encoding)
else
LengthCounter.new(source, encoding)
end
@cache = {} #: Hash[Integer, Integer]
@offsets = [] #: Array[Integer]
end Инициализирует новый кэш с указанными источником и кодировкой.
Открытые методы экземпляра
# File lib/prism/parse_result.rb, line 230
def [](byte_offset)
@cache[byte_offset] ||=
if (index = @offsets.bsearch_index { |offset| offset > byte_offset }).nil?
@offsets << byte_offset
@counter.count(0, byte_offset)
elsif index == 0
@offsets.unshift(byte_offset)
@counter.count(0, byte_offset)
else
@offsets.insert(index, byte_offset)
offset = @offsets[index - 1]
@cache[offset] + @counter.count(offset, byte_offset - offset)
end
end Возвращает смещение в единицах кода для указанного смещения в байтах.
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.