2014-03-25 49 views
7

这可能不是一个很好的问题,因为我不知道任何支持此功能的编译语言,但是因为Go始终令我感到惊讶,所以我仍会问这个问题:Go是否支持运算符类型变量?

对于我自己的练习,我正在Go上写一个小计算器程序。我不知道是否有一种方法可以让我申报和分配型“经营者”的一个变量,这样我可以,例如,写:

var o Operator 

o = + 

var o1 Operator 

o1 =/

和写入功能这样

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

    return a o b 

} 

(不,我不是问运营商超载。)

副手,我不知道任何编译语言支持这样的事情(我不是这方面的专家)。我看过运营商下的文档,什么都没发现。可以再次让我感到惊讶吗?

编辑:是哈斯克尔支持该接受的答案州,

+2

任何特别的原因这是downvoted?由于Haskell支持这一点,根据@ tomwilde的回答,这不是一个愚蠢的问题,我看过运营商下的文档,什么都没发现,但Go似乎有它的份额'复活节彩蛋' – Vector

+0

Io可以做这样的事情。 – dethtron5000

+0

@ dethtron5000 - 有趣。从来没有听说过'Io',只是查看它 - 不是我认为的主流语言...... :)我看到它在虚拟机中运行。它是否编译成类似于Java字节码或MSIL的东西? – Vector

回答

7

没有,你去运营商都没有的功能,因此没有有效的右手表达式。他们以通用的方式工作,例如加号运算符适用于所有数字类型,并且中缀符号也不受支持。

你将不得不使用反射编写自己的“软” - 通用附加功能。

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

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) 
} 
+0

对不起,我不能接受这两个答案。但@tomwilde是第一个,也是技术上更详细的。但是你的解决方法是我可能会实现的一个**优秀的**想法。 – Vector

+4

请注意,如果您将BinaryOperator()放在func文字周围,此示例仍然有效:var OpAdd = func(a,b int)int {return a + b}并且与OpSub类似。 –

+0

谢谢拉斯!我更改了代码以纳入您的建议。 –

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) 
} 
+0

我更喜欢@Anonymous的答案中的方法 - 它只是一个很好的老式函数指针,只是做了Go风格(使它清晰和简单)并保持通用,尽管您的方法也可以用类似的设计模式工作。另请参阅[如何将int值转换为字符串?](http://stackoverflow.com/questions/10105935/how-to-convert-a-int-value-to-string-in-go) – Vector