2012-02-28 44 views
10

我正在學習Ruby,並且我已經看到方法名稱末尾的感嘆號按照慣例意味着該方法以某種方式修改了self。爲什麼Array#delete沒有以感嘆號結尾,如slice!呢,因爲deleteself刪除了一個元素?我錯過了一些基本的東西?命名約定:爲什麼Array#delete在末尾沒有感嘆號?

+0

我的猜測是因爲'#delete'只能刪除,所以不需要標記它。像'#upper_case'這樣的東西可以分配給新創建的對象,或者在確定使用時覆蓋原始對象。 – ScottJShea 2012-02-28 20:35:41

+0

是的,但#delete沒有標誌也可以返回一個克隆減去指定的元素(這是我所期望的,因爲沒有標誌):) – 2012-02-28 20:45:12

+0

可能重複[爲什麼在Ruby方法中使用感嘆號?](http: //stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods) – 2012-02-28 21:34:29

回答

15

引述Matz(Ruby的總工程師):(!)

的爆炸並不意味着 「殺傷力」 也不缺這意味着非破壞性 要麼。砰的牌子的意思是「爆炸的版本更危險比它的非爆炸對手危險,小心處理」。

由於Array#delete不具有危險少對口,也沒有必要感嘆。

4

「爆炸」方法並不意味着它會修改接收器。它表明一種方法是現有方法更危險的版本。請參閱David A. Black's description的差異,以及response to a request更改Ruby 2.0。

這是一個很常見的誤解。請注意非常高的投票錯誤答案here