运算符重载

为了保持语言的简单性,V只支持有限的运算符重载,支持最常用的四则运算符,比较运算符,分配运算符的重载。重载通过自定义复杂类型的运算符语义,让代码可读性更好。

四则运算符:+,-,*,/,%

比较运算符:>, <, !=, ==, <=, >=

分配运算符:+=,-=,*=,/=

  • 比较运算符重载不用自己定义,编译器会基于小于和等于自动生成。

  • 分配运算符重载不用自己定义,编译器会基于四则运算符自动生成。

为了提高安全性和可维护性,运算符重载有以下限制:

  • 重载运算符的函数内部禁止调用其它函数。

  • 重载运算符的函数不能修改它们的参数。

  • 运算符两边的参数类型必须是同一类型。

  • 四则运算符的返回值必须跟结构体类型一致,比较运算符必须返回bool类型。

目前支持对:字典,结构体,泛型结构体,类型别名,进行运算符重载。

###结构体运算符重载

module main

struct Vec {
  x int
  y int
}

//四则运算符
pub fn (a Vec) + (b Vec) Vec {
  return Vec{a.x + b.x, a.y + b.y}
}

pub fn (a Vec) - (b Vec) Vec {
  return Vec{a.x - b.x, a.y - b.y}
}

pub fn (a Vec) * (b Vec) Vec {
  return Vec{a.x * b.x, a.y * b.y}
}

pub fn (a Vec) / (b Vec) Vec {
  return Vec{a.x / b.x, a.y / b.y}
}

fn (a Vec) % (b Vec) Vec {
  return Vec{a.x % b.x, a.y % b.y}
}

//比较运算符,只需要重载<和==,其他比较运算符不用自己定义,编译器会基于<和==自动生成
fn (a Vec) == (b Vec) bool {
  return a.x == b.x && a.y == b.y
}

fn (a Vec) < (b Vec) bool {
  return a.x < b.x && a.y < b.y
}

fn (a Vec) str() string {
  return '{${a.x}, ${a.y}}'
}

fn main() {
  mut a := Vec{8, 15}
  b := Vec{4, 5}
  //四则运算符
  println(a + b) // {12,20}
  println(a - b) // {4,10}
  println(a * b) // {32,75}
  println(a / b) // {2,3}
  println(a % b) // {0,0}
  //分配运算符,分配运算符不用自己定义,会基于四则运算符自动生成
  a += b
  println('a+=b is: ${a}')
  a -= b
  println('a-=b is: ${a}')
  a *= b
  println('a*=b is: ${a}')
  a /= b
  println('a/=b is: ${a}')
  //比较运算符
  println(a == b) // false
  println(a != b) // true
  println(a > b) // true
  println(a >= b) // true
  println(a < b) // false
  println(a <= b) // false
}

泛型结构体运算符重载

类型别名运算符重载

除了可以对结构体定义运算符重载,还可以对类型别名进行运算符重载。

如果结构体定义了运算符重载,类型别名也可以直接使用。

最后更新于

这有帮助吗?