Spec-Zone.ru › Ruby 3.4
  1. Prism::
  2. CodeUnitsCache

class Prism::CodeUnitsCache

Родительский класс:
Object

Кэш, который можно использовать для быстрого вычисления смещений в единицах кода по смещениям в байтах. Он намеренно предоставляет только один метод [] для доступа к кэшу, чтобы свести к минимуму его интерфейс.

Обратите внимание, что здесь есть несколько известных проблем, которые могут быть устранены в будущем, а могут и нет:

  • Первая проблема возникает, когда кэш вычисляет значения, не соответствующие границам символов. Из-за этого последующие вычисления могут смещаться на одну или несколько единиц кода.

  • Вторая проблема заключается в том, что размер этого кэша в настоящее время не ограничен. Теоретически можно было бы добавить кэш LRU, чтобы ограничить количество записей, но такая возможность пока не реализована.

Открытые методы класса

new (source, encoding) Показать исходный код
# 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

Инициализирует новый кэш с указанными источником и кодировкой.

Открытые методы экземпляра

[] (byte_offset) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API