关于函数,数学符号函数*的调用方式不同。为什么呢?

时间:2016-11-09 09:36:04

标签: swift function syntax

乘法符号的定义是这个。

public func *(lhs: Int, rhs: Int) -> Int

我可以在一个函数中使用它,就像这样。

func productUsingReduce(xs: [Int]) -> Int {
    return xs.reduce(1, { x,y in x * y})
}

或者就是这样。

func productUsingReduce(xs: [Int]) -> Int {
    return xs.reduce(1, *)
}

如果我尝试使用不同的名称定义相同的内容。

func yes(lhs: Int, rhs: Int) -> Int {
    return lhs * rhs
}

当我尝试使用它时,我遇到编译器错误。

func productUsingReduce(xs: [Int]) -> Int {
    return xs.reduce(1, { x,y in x yes y})
}

为什么?

为什么下面的sytnax没有编译?

func productUsingReduce(xs: [Int]) -> Int {
    return xs.reduce(1, { x, y in *(lhs: x, rhs: y) })
}

2 个答案:

答案 0 :(得分:1)

您的函数func yes(..只是一个标准函数。

要定义运算符,您必须声明运算符

infix operator yes

和相应的功能

func yes(lhs: Int, rhs: Int) -> Int {
   return lhs * rhs
}

但现在出现了坏消息:你不能使用字母数字字符作为运算符。

答案 1 :(得分:0)

*定义由两部分组成:

方法定义(Swift.Math.IntegersSwift.Math.Floating等)

public func *(lhs: Int, rhs: Int) -> Int

及其操作符行为(在Swift中,您可以在Xcode中编写import Swift并在CMD上单击它以访问该文件)

infix operator * : MultiplicationPrecedence

最后一个片段使*成为中缀运算符,因此您只能以中缀形式使用它。

关于yes功能,您无法使其成为运营商。当可以定义您自己的自定义运算符时,它们只能包含某些字符。根据{{​​3}}:

  

自定义运算符可以以ASCII字符之一/,=, - ,+,!,*,%,<,>,&,|,^,?或〜或其中一个Unicode开头下面的语法中定义的字符(包括数学运算符,杂项符号和标志Unicode块中的字符等)。在第一个字符之后,也允许组合Unicode字符。

所以你必须使用它的标准函数形式。

但你可以做到

func ^^^(lhs: Int, rhs: Int) -> Int {
  return lhs * rhs
}

infix operator ^^^

这将按预期工作

3 ^^^ 2 // 6