开始使用Acarua
变量和常量的定义
使用 mut
关键字定义变量,使用 let
关键字定义常量.变量和常量的定义方式和类型注解的规则如下:
mut mutiableName: DataType = value
let constantName: DataType = value
示例:
mut age: Int 25
let name: String "John"
mut demo: Float, demo2: Double = 1.14, 5.14
编译期常量
条件: 只能为基本类型 使用let const即可
条件判断
使用 if (表达式) { 语句... } else { 语句... }
进行条件判断. 示例:
if (age >= 18) {
print("You are an adult.")
}
else {
print("You are a minor.")
}
循环
使用 when (条件) { 循环体... }
进行循环. 示例:
when (i < 10) {
print(i)
i++
}
或者使用 yield [<variable name> in] <iterable object name> {语句...}
实现遍历功能,其中 { 语句... }
表示循环体. 示例:
yield index in generate<int>(0,10) {
print(index)
}
基本类型
主要的数据类型有整数Int
、短整型Short
、长整型Long
、字符型Char
、单精度浮点数Float
、双精度浮点数Double
、布尔型Boolean
和字符串String
. 对于Int, Short, Long, Float, Double,在其类型名前加上Signed
或Unsigned
可以代表其有符号或无符号变体.如未指定,则默认为有符号.
更多类型
函数
用下面的类型来描述一个函数:
(Type1, Type2, ...) -> ResultType
就像这样:
(Int, Float) -> Float
如果只有一个参数,则括号可以省去:
Int -> Int
嵌套的函数调用:
fun F1(v: Int): Int {...}
fun F2(v: Int): Int {...}
let r = F1(1) |> F2
则r的类型被推断为Int
, 调用过程的类型是Int -> Int -> Int
四则运算
四则运算符为 +
、-
、*
、/
,还有 **
表示平方,//
表示开平方,%
表示取余. 示例:
mut sum = 1 + 2
mut difference = 5 - 3
mut product = 4 * 6
mut quotient = 12 / 3
mut remainder = 10 % 3
mut square = 2 ** 3
mut squareRoot = 9 // 3
逻辑运算符
逻辑运算符有逻辑非!
、逻辑与&&
和逻辑或||
. 示例:
mut isTrue true
mut isFalse false
mut notTrue !isTrue
mut trueAndFalse isTrue && isFalse
mut trueOrFalse isTrue || isFalse
位运算符
位运算符有按位与&
、按位或|
、按位非-
、按位异或^
、左移<<
和右移>>
. 示例:
let a 5
let b 3
let bitwiseAnd = a & b
let bitwiseOr = a | b
let bitwiseNot = -a
let bitwiseXor = a ^ b
let leftShift = a << 2
let rightShift = a >> 1
函数定义
使用 fun
关键字定义函数,后接函数名,参数定义在小括号中,可选的返回值类型在大括号之前. 示例:
fun functionName(parameter1: DataType, parameter2: DataType): ReturnType {
// function body
return value
}
fun printName(name: String) {
printf("Name: $name")
}
简写函数定义
匿名函数
一个匿名函数可以以如下的方式定义:
fun (arg: type) {...}
如果不需要接收参数,甚至可以进一步简化到下面的样子:
{
//这里是函数体...
}
还能使用let定义:
let name = (argslist...) = {...}
无参数的函数
可以这么写:
fun Fool {...}
小技巧
管道运算符
你可以不用大量嵌套函数调用:
f1(f2(f3(a)))
而是这样:
f3(a)
|> f2()
|> f1()
舒服多了,不是吗?
这种情况下(一个函数全部由这种形式组成,没有其他中间项),你就可以这么写一个函数:
let testFun = (x, y)
|> f1()
|> f2()
调用无参函数
其实对于一个无参函数,调用它时只需要保证在当前命名空间中其标识符唯一,就可以省去调用时的小括号,例如,上面的例子可以改成这样:
let testFun = (x, y)
|> f1
|> f2
可能有人觉得这样可读性会变低,毕竟这种东西挺见仁见智的
定义类
使用 class
关键字定义类,后接类名,继承关系在类名后的使用冒号指定. 如果你写过kotlin,那么acarua的类应当让你感觉回家了一样: 示例:
class Parent([let/mut][&] <arg>: <type>) {
//...
}
class Children: Parent { ... }
覆盖构造函数和析构函数
通常情况下,acarua会为你自动创建构造和析构函数.不过如果你想手动控制这一过程,仍可以通过constructor
和destructor
关键字指定.
class Fool constructor(arg: Int) {
//主构造函数体...
destructor {
//析构函数体...
}
}
与kotlin不同,acarua允许在主构造函数中编写语句和表达式:
class Example(arg: Int) {
let private a
//更多...
}
定义协议
使用protocol
关键字定义一个协议,后接协议名:
protocol ExampleProtocol {
fun Example: Int {...}
let attr: Int
}
类可以通过继承类似的方式指明实现了某个协议:
class ImplClass: ExampleProtocol {
let attr: Int
fun Example: Int {
//...
}
}