表达式是一个储存了一系列委托与一系列运算符的容器,当表达式解析时,所有委托被执行并转换为元素,然后重复使用优先级最高的运算符计算其相关的两个元素,重复这一过程直到所有运算符都被处理过,表达式解析结束,表达式的结果是剩下的唯一元素。
每次解析表达式时,执行的相同函数也可能会产生不同结果(比如说random()),因此表达式解析前函数只会作为一个执行函数的委托存于表达式中,在表达式解析开始时才会转换为元素,委托有以下类型:
random()
CALL_SELF 调用自身,格式:元素()
CALL_SELF
CALL_METHOD 调用函数,格式:元素.method()
CALL_METHOD
GET_FIELD 获取属性,格式:元素.field
GET_FIELD
PARSE_VARIABLE 检查文本是不是变量
PARSE_VARIABLE
SUB_EXPRESSION 处理执行的子表达式
SUB_EXPRESSION
(-5).abs()+random() 运算符 [+] 委托: - Int@-5 -> CALL_METHOD abs() - String@random -> PARSE_VARIABLE -> CALL_SELF
在了解委托后你可能可以很容易的理解,函数 random() 其实只是文本 random 执行了 PARSE_VARIABLE 委托,真正的函数存在全局变量中。
random
最后更新于2年前