我一直在阅读我正在研究的项目Spanned/Spannable课程的文档。我对包含MARK
和POINT
的范围的定义和用法感到困惑。
MARK
似乎在文档中定义为“附加”到角色的位置,而POINT
被定义为“粘合”到角色。因此,当文本发生更改时,MARK
将不会移动,并且POINT
将随着文本更改时“胶合”的字符移动。
这些定义似乎表明MARK
与INCLUSIVE
同义,POINT
与EXCLUSIVE
同义。
但是,情况并非如此,因为SPAN_MARK_MARK
和SPAN_POINT_POINT
都不是SPAN_INCLUSIVE_INCLUSIVE
或SPAN_EXCLUSIVE_EXCLUSIVE
的同义词。事实上,SPAN_INCLUSIVE_INCLUSIVE
与SPAN_MARK_POINT
相同,SPAN_POINT_MARK
与SPAN_EXCLUSIVE_EXCLUSIVE
相同。
我的问题如下
为什么SPAN_POINT_MARK
与SPAN_EXCLUSIVE_EXCLUSIVE
同义?为什么SPAN_MARK_POINT
与SPAN_INCLUSIVE_INCLUSIVE
同义?
为什么SPAN_MARK_MARK
和SPAN_POINT_POINT
分别与SPAN_INCLUSIVE_INCLUSIVE
和SPAN_EXCLUSIVE_EXCLUSIVE
同义?
此用法中MARK
和POINT
的真实定义是什么?
答案 0 :(得分:14)
我喜欢解释MARK vs POINT的方法是将它们表示为方括号,以及它们在一系列文本中存在的任何偏移量。括号指向的方向显示标记或点“附加”的字符。
因此对于POINT,您将使用开括号 - 它附加到跟随它的字符。对于MARK,你可以使用近括号 - 它附加在它前面的字符上。
让我们看一下每种类型的一些例子:
<强> SPAN_MARK_MARK 强>
在0长度范围的偏移处插入:标记保持固定。
Before: Lorem ]]ipsum dolor sit. After: Lorem ]]INSERTipsum dolor sit.
在非0长度范围的开头插入:插入的文本包含在范围的范围内。
Before: Lorem ]ipsum] dolor sit. After: Lorem ]INSERTipsum] dolor sit.
在非0长度范围的末尾插入:插入的文本将从范围的范围中排除。
Before: Lorem ]ipsum] dolor sit. After: Lorem ]ipsum]INSERT dolor sit.
从最后两个示例中可以看出,为什么SPAN_MARK_MARK
标志与SPAN_INCLUSIVE_EXCLUSIVE
标志同义。在范围开始处插入的文本包含在范围内,而在末尾插入的文本将被排除。
<强> SPAN_POINT_POINT 强>
在0长度范围的偏移处插入:向前推动点。
Before: Lorem [[ipsum dolor sit. After: Lorem INSERT[[ipsum dolor sit.
在非0长度范围的开头插入:插入的文本从范围的范围中排除。
Before: Lorem [ipsum[ dolor sit. After: Lorem INSERT[ipsum[ dolor sit.
在非0长度范围的末尾插入:插入的文本包含在范围的范围内。
Before: Lorem [ipsum[ dolor sit. After: Lorem [ipsumINSERT[ dolor sit.
再次,您可以从最后两个示例中看到为什么SPAN_POINT_POINT
标志与SPAN_EXCLUSIVE_INCLUSIVE
标志同义。在范围的开头插入的文本将从范围中排除,而包含在末尾的文本则包括在内。
<强> SPAN_MARK_POINT 强>
在范围的开头插入:插入的文本包含在范围内。
Before: Lorem ]ipsum[ dolor sit. After: Lorem ]INSERTipsum[ dolor sit.
在范围的末尾插入:插入的文本仍包含在范围内。
Before: Lorem ]ipsum[ dolor sit. After: Lorem ]ipsumINSERT[ dolor sit.
因此它具有同义词SPAN_INCLUSIVE_INCLUSIVE
- 插入的文本始终包含在范围的范围内。
<强> SPAN_POINT_MARK 强>
在范围的开头插入:插入的文本将从范围中排除。
Before: Lorem [ipsum] dolor sit. After: Lorem INSERT[ipsum] dolor sit.
在范围的末尾插入:插入的文本仍然从范围中排除。
Before: Lorem [ipsum] dolor sit. After: Lorem [ipsum]INSERT dolor sit.
因此它具有同义词SPAN_EXCLUSIVE_EXCLUSIVE
- 插入的文本始终从范围的范围中排除。
我认为文档通过拆分某些同义词的定义来混淆事物。例如,在描述SPAN_MARK_MARK
时,它们仅根据0长度范围定义其用法。然后,在定义SPAN_INCLUSIVE_EXCLUSIVE
(它是同义词)时,它们仅根据非0长度跨度定义其用法。如果他们事先声明他们是同义词,并且两个术语共享一个定义,我认为会更清楚。
答案 1 :(得分:5)
它们是概念性概念,并按它们出现的顺序来考虑它们
来自文档:
MARK和POINT在概念上位于两个相邻的位置之间 字符。 MARK之前是一个“附加”的角色,而a POINT会坚持到后面的角色。插入光标是 概念上位于MARK和POINT之间。结果是, 在MARK和POINT之间插入一个新字符将离开 MARK不变,而POINT 将被移位,现在位于 插入的字符仍然粘贴在它后面的相同字符。 取决于插入是在开头还是结尾 跨度,跨度将因此扩大到包括新的 字符(当跨度在其开头使用MARK或POINT时 在它的最后)或它将被排除在外。注意这里之前和之后 引用String中的偏移,它们独立于视觉 文本的表示
你的观点
这些定义似乎表明MARK与INCLUSIVE同义 并且POINT是EXCLUSIVE的同义词。
事实并非如此。基本上将标记视为范围的起始标记,将点视为端点。这两点之间发生了什么(样式,向样式文本添加更多文本等)现在被归类为包容性和排他性,因此直接与它们相关联。
让我们看一个例子: 假设我们有以下文字样式
这是示例文字
如果我们在粗体跨度上使用SPAN_EXCLUSIVE_EXCLUSIVE,并且我们在跨度的中间插入文本,它仍然是粗体:
这是一个令人难以置信的好例子文本
但是如果我们在粗体跨度的开头或末尾插入文本,插入文本不是粗体字:
这不是示例文字
如果我们使用SPAN_INCLUSIVE_EXCLUSIVE,那么在开头插入文本将作为范围的一部分包含在内,我们将拥有:
相当一个例子文字不是
现在这一切只是我对文档的解释。为什么SPAN_POINT_MARK是SPAN_EXCLUSIVE_EXCLUSIVE的同义词,谷歌的某些人必须发表评论,但在我看来,MARK_POINT运动代表包含,POINT_MARK代表排除。 SPAN_POINT_POINT和SPAN_MARK_MARK表示0个长度字符串,因此不能归因于包含/排除。
<强>:编辑:强> SPAN_MARK_MARK和SPAN_POINT_POINT是0个长度的字符串,即字符串以0位置的标记开始,然后任何后续添加都附加到字符串但标记位置不会改变,或者字符串以点位置开始,并且对字符串的任何后续添加都会移动指向最后。这些标志实际上表示起始点是一个spannable字符串,因此表示0长度字符串。然后可以使用包含的独占标志,具体取决于字符串是mark_mark还是point_point开头。另外SPAN_EXCLUSIVE_INCLUSIVE,当0长度时,表现得像标记和SPAN_INCLUSIVE_EXCLUSIVE,当0长度表现得像点,这从他们被定义的方式很明显。这是我对文档的解释