class Prism::CodeUnitsCache
一个缓存,可用于快速计算字节偏移量对应的代码单元偏移量。它特意只提供一个 []
方法来访问缓存,以尽量减少表面积。
请注意,这里有一些已知问题,未来可能会或可能不会解决
-
第一个问题是,当缓存计算的值不在字符边界上时会出现问题。这可能会导致后续的计算偏差一个或多个代码单元。
-
第二个问题是,此缓存目前是无界的。理论上,我们可以引入某种 LRU 缓存来限制条目的数量,但这尚未实现。
公共类方法
new(source, encoding) 点击切换源码
使用给定的源和编码初始化一个新的缓存。
# File prism/parse_result.rb, line 198 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 prism/parse_result.rb, line 212 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