gpt4 book ai didi

ruby - 组成切片切片

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:59 25 4
gpt4 key购买 nike

这几天我一直在思考这个问题,但我找不到适合我生活的优雅解决方案。

在我的应用程序中,我有一个 Text 类,它只是 String 的包装器:

class Text < Struct.new(:string, :style)
def [](start, len)
Text.new(string[start, len], style)
end

def length
string.length
end

def to_s
case style
when :bold then "**" + string + "**"
when :italic then "_" + string +"_"
else string
end
end

def inspect
"<[#{style}] #{string}>"
end
end

我还有一个 Line 类,它基本上是一个文本对象数组:

class Line < Struct.new(:texts)
def [](start, len)
# TODO Should return a new Line object.
end

def length
texts.map(&:length).reduce(&:+)
end

def to_s
texts.map(&:to_s).join
end

def inspect
texts.map(&:inspect).join(" ")
end
end

问题是,我如何在 Line 中实现 #[] 以便它返回一个“正确”切片的新 Line 对象包含的 Text 对象?

思路是模仿String的切片行为。例如:

line = Line.new([Text.new("abcdef", :bold), Text.new("ghijkl", :default)])
puts line[0, 2] # => **ab**
p line[0, 2] # => "<[:bold] ab>"
puts line[3, 6] # => **def**ghi
p line[3, 6] # => "<[:bold] def> <[:default] ghi>"

请记住,Text 对象的长度是其 string 成员的长度:

a = Text.new("abc", :bold)
puts a # => **abc**
puts a.length # => 3

并且 Line 对象的长度只是其 texts 长度的总和:

line = Line.new([Text.new("abcdef", :bold), Text.new("ghijkl", :default)])
puts line.length # => 12

我尝试过的每件事都涉及大量复杂的条件和令人费解的临时变量,我觉得在这一切之下隐藏着一个更简单的解决方案。

最佳答案

下面是一个可能对您有帮助的片段:

class Line

def pos_to_index_and_offset(pos)
raise ArgumentError if !texts or texts.empty?
index = 0
offset = pos
while offset >= (size = texts[index].length)
offset -= size
index += 1
raise ArgumentError if index > texts.length
end
return [index, offset]
end

end

关于ruby - 组成切片切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com