GKD规则编写之选择器-2

关系选择器

上一篇讲完了属性选择器,现在来讲关系选择器

关系选择器用于连接两个属性选择器,可以回忆一下1+2的例子,+号就是所谓关系选择器

关系选择器由两部分构成,分别是:关系操作符关系表达式

关系操作符

关系操作符,用于指示查找节点的方向

打个比方,将所有的节点比作一个大家庭,那么这个家庭里面就肯定会有兄弟姐妹、祖先后人。那么关系操作符就是用来描述两个节点间的关系。

关系操作符有5种:+-><<<

+

+操作符,表示前置兄弟节点。

何为前置兄弟节点?

这里给一个样例:A + B

用回那个比喻,A跟B就是家里的两兄弟,而且他们是“相邻”的兄弟(“相邻”的兄弟就是指大哥和二哥、三哥和四哥这样的数字相邻的兄弟)

A是大哥,B就是二哥

只能匹配相邻的兄弟节点,那岂不是很鸡肋?

放心,在讲完关系表达式后,就不会让你觉得鸡肋了

-

-操作符,表示后置兄弟节点。

还是那个样例,不过把+换成-变成:A - B

A和B还是家里的两兄弟,也还是“相邻”兄弟,但是现在:

B是大哥,A是二哥

总的来说,可以类比数学的逆运算,-操作符就是+操作符的逆运算

>

>操作符,表示祖先节点。

有请助教样例大哥:A > B

祖先节点,字面意思:就是谁是谁祖先

那么看到样例,A是B的祖先,很好理解吧

但是祖先也有辈分之分啊,这个样例中,A就是B的爸爸(没错,你可以管你的爸爸叫祖先)

还是那句话,讲完关系表达式就可以解锁更高级操作了

<

<操作符,表示直接节点

还是助教大哥:A < B

还是按照字面理解:谁是谁儿子

样例中表达的就是:A节点是B节点儿子

<<

<<操作符,表示子孙节点

不说了,懂得都懂:A << B

还是字面意思:谁是谁的子孙,也就是谁是谁的后代

样例就是:A是B的后代

关系表达式

关系表达式分两种,元组表达式多项式表达式。关系表达式被()括起来,并且位于关系操作符的后方

元组表达式

元组表达式由有序递增的正整数组成,可以理解为数学中的数列

下面是几个元组表达式

  • (1)
  • (1,2,3,4,5)
  • (2,4,6)

多项式表达式

多项式表达式中的多项式就是数学中的一元一次多项式,在多项式表达式中以n为未知数

从本质来说,多项式表达式元组表达式的另一种表达方式

这个元组的数字满足集合 {an+b|an+b>=1,n>=1}(a,b是常整数) 如果集合为空集则表达式非法

那么,根据初中数学相关知识,我们可以知道:

  1. 当a<=0时,存在一个等价的有限元组表达式,如:

    • (-n+4)等价于(1,2,3)
    • (-3n+10)等价于(1,4,7)
  2. 当a>0时,存在一个等价的无限元组表达式,如:

    • (n)等价于(1,2,3,...)
    • (2n-1)等价于(1,3,5,...)

关系选择器

将 关系操作符 和 关系表达式 连接起来就得到了 关系选择器

用法解释

以下是5个关系选择器

  • A +5 B
  • A -5 B
  • A >3 B
  • A <3 B
  • A <<n B

对于A +5 B,就是说:A是大哥,B就是六哥

同样的,对于A -5 B,A是六哥,B是大哥

对于A >3 B,A是爷爷(设为第1代),B是曾孙子(则B为第4代)

但是A <3 B有些许不同,不知道你有没有注意到:在介绍<关系操作符时,字被加粗了。

因为A <3 B并不是曾孙子与爷爷的关系,而是三哥与爸爸的关系,即:A是B的三儿子

对于A <<n B,A是B的祖先,由于它的多项式表达式(n),等价的元组表达式就是(1,2,3,...),所以可以找到A的所有B祖先

定义

还记得上一篇讲过的属性名吗?其中的indexdepth是确定两个节点之间关系的关键

A +(a1,a2,a3,a_n) B : A.index 满足 B.index-(a_m), 其中 a_m 是元组的任意一个数字

A -(a1,a2,a3,a_n) B : A.index 满足 B.index+(a_m)

A >(a1,a2,a3,a_n) B : A.depth 满足 B.depth-(a_m), 根节点的 depth=0

A <(a1,a2,a3,a_n) B : A.index 满足 a_m-1

A <<(a1,a2,a3,a_n) B : A.order 满足 a_m-1, A.order(无法通过网页审查工具得知) 是深度优先先序遍历的索引 (搭配 quickFind 使用)

所以,确定两个节点的关系关键在于indexdepth的值,而不是单纯的数户口。

例如:现在有2个FrameLayout,其中一个的index值是0,另一个的index值是3,但是它们在网页审查工具中是相邻的节点。如果你要使用-关系操作符选中index为3的FrameLayout,这时规则就不能写成@FrameLayout[index=3] - FrameLayout[index=0]了,而应写成@FrameLayout[index=3] -3 FrameLayout[index=0]。当然,实际中写成FrameLayout[index=3]会更好。

简写

当 a=0 或 b=0 时, 括号可以省略, 比如 A +(3n+0) B -> A +(3n) B -> A +3n BA +(0n+3) B -> A +(+3) B -> A +3 B

当 a=0 且 b=1 时, an+b 可以省略, 比如 A <(0n+1) B -> A < B, 此外 A + B,A > B 都与等价的 css 语法语义相同

当 a=1 且 b=0 且操作符是 >, 可以进一步简写, 比如 A >(1n+0) B -> A >n B -> A B, 这与等价的 css 语法语义相同

当然,不简写也是可以的,就是会丧失一些代码的简洁性

后记

那么,GKD规则编写之选择器的教程就到此结束,也欢迎在评论区留言探讨。

如果本教程有什么谬误,或者对本教程有什么建议的话,也欢迎在下方评论区给出你的建议。

本篇教程不算太完善,以后会慢慢优化的。

那么,祝你写的规则不会误触,不会失效!


GKD规则编写之选择器-2
https://blog.adproqwq.top/2023/12/23/GKD规则编写之选择器-2/
作者
Adpro
发布于
2023-12-23
许可协议