文章目录
简介
raku中提供了非常多的运算符操作,除了常见的数值和逻辑上的计算之外,对于类型转换、数据生成等常用操作,也提供了相应的运算符。
此外,运算符作用在变量或字面量的不同位置,可能会产生不同的结果,据此可将运算符分成以下类别
类型 | 解释 | 示例 |
---|---|---|
前缀 | 用在项前 | ++1 |
中缀 | 用在项与项之间 | 1+2 |
后缀 | 用在项后 | 1++ |
环缀 | 包围项 | (1) |
后环缀 | 在一个项之后, 包围另一个项 | Array[1] |
数值和字符串运算
运算符这个概念最初肯定是用在数值计算的,比如最经典的加减乘除,后来随着运算符可以被重载,也运用在字符串上,使之可以拼接、重复。这些运算在许多编程语言中均有提供,理解起来也比较方便,下面举出
类型 | 运算符 |
---|---|
加减乘除 | +, -, *, / |
数值运算 | 指数【**】;整除【div】;取模【%】;整除判断【%%】 |
数论运算 | 最大公约数【gcd】;最小公倍数【lcm】 |
字符串运算 | 拼接【~】;重复【x】 |
示例如下,注释后是运算结果
3 div 2 # 1
(-3) div 2 # -2
6 gcd 9 # 3
9 ~ 7 # 97
13 x 3 # 131313
"Hi " x 2 # Hi Hi
raku中还提供了自增和自减运算符,并分别提供了前缀和后缀的模式,其增减逻辑与C语言相通,当作为前缀使用时,先计算,后返回;当作为后缀时,先返回,后计算。
my $a=2;
my $b=2;
++$a; # 返回 3
$b++; # 返回2
比较
在编程中常见的比较操作,其比较对象往往要有相同的数据类型,比较结果一般是True或False,Raku针对这种比较方法,提供了数值和字符串两类中缀运算符,如下表所示。
功能 | 数值运算符 | 字符串运算符 |
---|---|---|
相等 | == | eq |
不等 | != | ne |
小于 | < | lt |
大于 | > | gt |
小于等于 | <= | le |
大于等于 | >= | ge |
此外,raku还提供了返回类型是Same, Less或者More的比较运算符,其中<=>
用于数值比较;leg
用于字符串比较;cmp
则不限数据类型比较,示例如下
1 <=> 1.0 # Same
"a" leg "b" # Less
'a' cmp 2 # More
最后,Raku还提供了功能更加强大的智能匹配运算符【~~】,其效果如下
2 ~~ 2 # True
"Raku" ~~ "Raku" # True
"Raku" ~~ Str # True
类型转换
raku中,将类型转换操作也运算符化了,即下面四个前缀运算符
+
强制转变为数值-
强制转换为数值并返回相反数?
强制转换为布尔值!
强制转换为布尔值并取反
非布尔类型,只有空字符串、未分配的变量以及数值0才会被强转为False,否则转换结果均为True,示例如下
+ "3" # 3
- "5" # -5
?"Hello" # True
my $valid;
?$valid # False
!2 # False
构造数据
Raku中提供了区间这种数据类型,可用于表示连续的数列,并配套了一些中缀操作符,用于构造不同类型的区间。根据区间左右的开闭情况,可分为如下四类,规律是,有尖号即为开区间,否则为闭区间。
运算符 | 示例 | 结果 | 运算符 | 示例 | 结果 |
---|---|---|---|---|---|
… | 0…5 | [ 0 , 5 ] [0,5] [0,5] | … | 0…5 | ( 0 , 5 ) (0,5) (0,5) |
…^ | 0…^5 | [ 0 , 5 ) [0,5) [0,5) | ^… | 0^…5 | ( 0 , 5 ] (0,5] (0,5] |
其中,从0开始的左闭右开区间,有一个更加方便的前缀运算符,例如5就等价于0…^5。
此外,Raku中还提供了惰性列表构造运算符…,可生成惰性列表,即只有接到请求时才返回元素。
最后,通过竖线|,可将区间展开成列表,示例如下
my $r = 0..5; # 0..5
|$r # (0 1 2 3 4 5)
高级运算符
此所谓高级,指的是作用在运算符上的运算符。Raku提供了两类运算符操作,一类是针对中缀运算符,只需在运算符前面加个R,就能得到调换运算符两边的参数后运算的结果。另一类则提供了相同运算符的归约运算,可以大大节省代码。二者示例如下。
2 / 3 # 0.666667
2 R/ 3 # 1.5
[+] 1,2,3,4,5 # 等价于 1 + 2 + 3 + 4 + 5
标签:运算,示例,数值,运算符,详解,Raku,True
From: https://blog.csdn.net/m0_37816922/article/details/136725900