Go是否支持运算符类型变量?

Vec*_*tor 8 variables operators variable-assignment go

这可能不是一个很好的问题,因为我不知道任何支持这个功能的编译语言,但是由于Go总是令我惊讶,我还是会问它:

对于我自己的练习,我正在Go中编写一个小计算器程序.我想知道是否有一种方法可以声明并分配一个类型为"运算符"的变量,这样我就可以编写:

var o Operator

o = +

var o1 Operator

o1 = /
Run Code Online (Sandbox Code Playgroud)

并写这样的功能

func DoOperation(a,b int,o Operator) int{

    return a o b

}
Run Code Online (Sandbox Code Playgroud)

(不,我不是在询问运营商是否超载.)

另外,我不知道任何支持这种事情的编译语言(我不是这方面的专家).我确实查看了运算符下的文档并没有发现任何内容.可以再次让我惊讶吗?

编辑: 接受的答案表明Haskell支持这一点,

thw*_*hwd 7

不,Go运算符不是函数,因此没有有效的右手表达式.它们以通用方式工作,例如,plus-operator适用于所有数字类型,而infix-notation也不支持la haskell.

您必须使用反射编写自己的"软" - 通用添加功能.

一种涵盖所有需求的编译语言是Haskell.


Pau*_*kin 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)
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您在func文字周围删除BinaryOperator(),此示例仍然有效:var OpAdd = func(a,b int)int {return a + b},类似于OpSub. (4认同)