2013-03-09 87 views
9

大衛·布萊克在他的書中指出:爲什麼我們不能重寫`||`和`&&`?

[T]他有條件賦值運算符||=,以及它很少發現 表妹& & =,這兩者都提供相同的一種快捷的爲僞操作符方法,但基於操作符,即||&&,您不能覆蓋它們。

爲什麼他特別提到我們不能覆蓋||&&

+10

因爲它們是語言的一部分,而不是方法。 – 2013-03-09 13:43:08

回答

11

與對象上一些其他運營商,誰的行爲在邏輯上可以依賴於類,布爾運算符是語言的一部分。當你有一個像==這樣的運算符時,可以合理地說這個運算符的行爲取決於對象的類型。的字符串應該由字符,通過鍵值元組哈希鍵值元組,等等。但是,&&||的行爲是基於語言的真假,沒有什麼的定義檢查角色目標具體。如果語言允許您覆蓋這些運算符,則可能會有不一致的布爾模型,並且這些運算符將變得完全無用。

此外,還有性能方面的考慮。因爲&&||短circut運營,這意味着,如果第一自變量,比方說,&&,評估爲假,第二個是從來沒有進行評價。使用||,如果第一次評估爲真,則第二次永遠不會評估。如果你可以重寫這些操作符,這種行爲是不可能的,因爲Ruby操作符被重載爲方法。在調用方法之前,必須根據定義評估所有參數。因此,短路操作員的性能提升和編程便利性喪失了。

+2

在Ruby中實現懶惰評估(或任何具有一流過程的語言)是完全可能的:只是將表達式包裝在lambda表達式中進行懶惰評估。 Ruby *確實*有lambda,甚至更好,它有* blocks *。在Ruby中用消息發送實現條件運算符當然是可能的。我其實只是爲了好玩。 – 2013-03-09 14:31:18

+0

@JörgWMittag:Ture,我從來沒有想到這一點。雖然我確信語言級別的短路仍然更有效率。 – Linuxios 2013-03-09 14:34:19

+0

@JörgWMittag如果你想在這方面分享任何東西,你可以在這裏提供一個答案。我很想在我的文章中看到你的解釋,你剛纔說的linuxios。 – 2013-03-09 14:39:07

相關問題