2015-05-31 147 views
1

我正在閱讀關於advanced operators的swift。爲什麼'infix`是默認的

基本功能:

func add(a: Unicorn, b: Unicorn) -> Unicorn { return a + b } 
add(u1, u2) // two unicorns are added 

中綴運算符:

func + (a: Unicorn, b: Unicorn) -> Unicorn { return a + b } 
c = u1 + u2 

後綴:

postfix func + (a: Unicorn) -> Unicorn { return a + 2 } // nonsense example 
u1+ 

我不明白怎麼infix可以推定爲默認值。從正常的函數聲明來看,它與我看起來沒有什麼不同。

這裏有什麼規則 - 任何單個字符是中綴操作的合法名稱?這是否意味着單個char函數不被允許?可以任意兩個參數函數在swift中被稱爲infix風格?

+0

有時候,爲了真正理解編程語言中的某些東西,你需要去學習一些關於編譯器的知識。在這種情況下,詞法分析是什麼以及語法分析是什麼。 – Sulthan

+0

要了解真正全面的知識,學習詞法分析器和編譯器會很棒。我很樂意參加編譯器課程。現在,只要知道如果函數名是一個運算符並且它有兩個參數就足夠了,'infix'是一個可導出的默認值。自定義操作符需要定義,所以這仍然有效。 – SimplGy

回答

5

我不明白如何中綴可以被認爲是默認的。

如果你使用兩個參數實現一個運算符,編譯器可以確定你想要一箇中綴運算符,因爲只有中綴運算符對兩個值進行操作。

如果您使用一個值實現運算符,編譯器不確定它是前綴還是後綴運算符,並且會發出抱怨。

中綴運算符有兩個值,後綴和前綴只有一個。

這是否意味着單個字符函數不被允許? swift中的任何兩個參數的函數都可以稱爲infix風格嗎?

號,與任何這些字符中的開頭的功能是一個操作符:/,=, - ,+, - ,*,%,<,>,&,|,^,或〜!? 1。操作員也可以由多個字符組成,但必須以其中一個字符開頭。

請記住,新的運營商必須首先聲明,對於這樣的實例:

prefix operator/{} 
prefix func/(a: Int) -> Int { 
    return a/42 
} 

/56 

但是這個聲明將無法工作,因爲a不是與運營商必須啓動的人物之一:

prefix operator a {} 

實際上有更多的字符。閱讀here

+0

很棒的回答。我錯過了一個事實,即操作符是一個預定義的[list of things](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/doc/uid/TP40014097) -CH30-ID410),如果你想要新的,你必須[單獨聲明](https://medium.com/swift-programming/facets-of-swift-part-5-custom-operators-1080bc78ccc) 。現在一切都很有意義。謝謝。 – SimplGy

0

如果我得到你的問題,我想答案是:你超載現有的運營商。

比方說,我們可以使用自定義操作,我需要聲明的前綴/中綴/後綴

編輯: 在互聯網上找到一個更好的例子:

像:

infix operator **= { associativity right precedence 90 } 
func **= (inout left: Double, right: Double) { 
    left = left ** right 
} 
1

不,不是所有單個字符都可以是中綴操作符。通常,規則是標識符(變量,方法名稱等)中允許的字符和運算符中允許的字符不相同。

例如,允許運營商中的字符指定here

更具體地,在令牌的第一個字符是決定性的。