运算符重载

有限的运算符重载

目前实现了四则运算符和比较运算符的重载

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

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

可以自定义复杂类型的运算符语义,让自定义类型的代码可读性会非常好

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

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

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

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

  1. module main
  2. struct Vec {
  3. x int
  4. y int
  5. }
  6. //四则运算符
  7. fn (a Vec) str() string {
  8. return '{$a.x, $a.y}'
  9. }
  10. fn (a Vec) + (b Vec) Vec {
  11. return Vec{a.x + b.x, a.y + b.y}
  12. }
  13. fn (a Vec) - (b Vec) Vec {
  14. return Vec{a.x - b.x, a.y - b.y}
  15. }
  16. //比较运算符
  17. fn (a Vec) == (b Vec) bool {
  18. return a.x == b.x && a.y == b.y
  19. }
  20. fn (a Vec) > (b Vec) bool {
  21. return a.x > b.x && a.y > b.y
  22. }
  23. fn (a Vec) < (b Vec) bool {
  24. return a.x < b.x && a.y < b.y
  25. }
  26. fn main() {
  27. a := Vec{2, 3}
  28. b := Vec{4, 5}
  29. println(a + b) // "{6, 8}"
  30. println(a - b) // "{-2, -2}"
  31. println(a == b) // false
  32. println(a > b) // false
  33. println(a < b) // true
  34. }