2016-11-09 4 views
1

乗算記号の定義はこれです。関数については、数学記号関数*が異なって呼び出されます。どうして?

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

答えて

0

*定義は2つの部分で構成されています

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

とそのオペレータの動作(Swiftに、あなたが書くことができ

メソッド定義(Swift.Math.Integersで、Swift.Math.Floatingなど)import Swift XcodeとCMDで+それをクリックしてファイルにアクセスします)

infix operator * : MultiplicationPrecedence 

*は最後のスニペットで埋め込み演算子になります。このため、埋め込みフォームでのみ使用できます。


機能についてyesについては、演算子として動作させることはできません。 には独自のカスタム演算子を定義できますが、それらには特定の文字しか含めることができません。 !language specificationあたりのとおり: - |、^、または〜、、、+、*、%、<、>、&

カスタム演算子は、ASCII文字/、=、のいずれかで始まることができますか?または以下の文法で定義されているUnicode文字の1つ(数学演算子、その他の記号、およびDingbats Unicodeブロックの文字を含む)のいずれかです。最初の文字の後に、Unicode文字を組み合わせることもできます。

標準機能フォームを使用する必要があります。

しかし、あなたは

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

infix operator ^^^ 

を行うことができ、それが期待通りに動作しますが

3 ^^^ 2 // 6 
1

あなたの機能func yes(..は標準的な機能です。

あなたはオペレータ

infix operator yes 

と、対応する機能

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

に宣言する必要がオペレータを定義するには、しかし、今、悪いニュースが来る:あなたは、事業者としての英数字を使用することはできません。

関連する問題