这可能不是一个很好的问题,因为我不知道任何支持这个功能的编译语言,但是由于Go总是让我感到惊讶,我还是会问它:
对于我自己的练习,我正在Go中编写一个小计算器程序。我想知道是否有一种方法可以声明并分配一个类型为“运算符”的变量,这样我就可以编写:
var o Operator
o = +
var o1 Operator
o1 = /
并编写这样的函数
func DoOperation(a,b int,o Operator) int{
return a o b
}
(不,我不是在询问运算符重载。)
副手,我不知道任何支持这种事情的编译语言(我不是这方面的专家)。我确实查看了运算符下的文档并没有发现任何内容。可以再次让我惊讶吗?
编辑:接受的答案表明Haskell支持此功能,
答案 0 :(得分:7)
不,Go运算符不是函数,因此没有有效的右手表达式。它们以通用方式工作,例如plus-operator适用于所有数字类型,而infix-notation也不支持la haskell。
您必须使用反射编写自己的" soft" -generic添加功能。
一种涵盖所有需求的编译语言是Haskell。
答案 1 :(得分:5)
您无法完全按照自己的意思行事,但您可以使用功能。你必须为每个操作员编写函数,但代码相对较少。
type BinaryOperator func(a, b int) int
func OpAdd(a, b int) int { return a + b }
func OpSub(a, b int) int { return a - b }
func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
return op(a, b)
}
答案 2 :(得分:0)
来自oop背景我开始这样做:
package main
import "fmt"
type MyInt int64
func (i * MyInt) Add(n MyInt) * MyInt {
*i += n
return i
}
func (i MyInt) String() string {
v := int64(i)
return fmt.Sprintf("0x%x (%d)", v, v)
}
func main() {
x := MyInt(10)
x.Add(10).Add(20).Add(30)
fmt.Println("x = ", x)
}