我是一個Ruby的新手,到目前為止,我發現關于!的解釋有點過于技術性。
假設我們有以下內容:
print "你的名字是什么?"
first_name = gets.chomp.upcase!
puts "嗨,#{first_name}。你好嗎?"
!對該方法有什么作用?它是否意味著每次我在隨后的任何字串中使用#{first_name}時,名字中的所有字母都將以大寫字母列印?如果我不使用!,代碼會受到什么影響?
如果可以的話,請用通俗易懂的語言解釋一下,因為我還在摸索Ruby的一些技術術語。
預先感謝。
uj5u.com熱心網友回復:
Ruby的方法名可以以!結尾。它本身并沒有什么特別的作用,但是有一個關于哪些方法有它的約定(盡管它并不總是一致的);因此,只要在逐個方法的基礎上學習方法String#upcase!(以及它與String#upcase的不同之處),約定是一個有用的提醒。
慣例是以!結尾的方法要么是危險的,要么是改變了物件,要么是執行了其他型別的改變,要么是在其他版本不會引發錯誤。
具體來說,String#upcase!改變了它所操作的字串。String#upcase會產生一個新的字串,這個字串是上調的。
foo = "test"。
p(foo.upcase) # => "TEST"/span>
p(foo) # => "test"
foo = "test"/span>
p(foo.upcase!) # => "TEST"
p(foo) # => "TEST"
正如注釋中所描述的,String#upcase!在不需要進行上劃的情況下回傳nil,所以你永遠不希望將String#upcase!的回傳值重新分配給你試圖upcase!的同一個變數。
foo = "TEST"/span>
p(foo.upcase!) # => nil
p(foo) # => "TEST"
RE: bang方法。看這里
編輯:"接收器 "是指接收資訊的物件(即方法呼叫)。在foo.upcase!中,foo中的物件是接收器。在"TEST".upcase中,字串"TEST"是接收者。
"in-place"`意味著物件本身被改變。另一種方法是創建一個新的物件,該物件具有你想要應用的變化,而對原始物件沒有變化。例如,如果你有一張照片,用一張紙蓋住下半部分,然后拍了一張照片,你就做了一個粗略的審查,創建了一張缺少下半部分的新照片(但原物仍然存在)。如果你在原照片上潑油漆,你就 "就地 "審查了它。
uj5u.com熱心網友回復:
!給這個方法增加了什么?
沒有什么。!只是訊息名稱的一部分,就像u、p、c、a、s和e。它并沒有改變資訊的任何內容。
如果我不使用!,代碼會受到什么影響?
那么你只是在發送一個不同的資訊。
upcase和upcase!或者foo和bar之間絕對沒有任何區別。它們只是資訊名稱。如果你寫foo,那么你就發送訊息foo,如果你寫bar,那么你就發送訊息bar,如果你寫upcase,那么你就發送訊息upcase(在你的例子中,它將被派發到方法String#upcase),如果你寫upcase!,那么你發送訊息upcase!(在你的情況下,它將被派遣到方法String#upcase!)。
以!結尾的訊息名稱絕對沒有什么特別之處,就像以?結尾的訊息名稱絕對沒有什么特別之處,就像以a或b或c結尾的訊息名稱絕對沒有什么特別之處。
然而,有一些是慣例。特別是,慣例是:
如果你有一對方法,它們都做了或多或少相同的事情,那么更令人驚訝的被命名為 就這樣了。這就是它的全部內容。
例如,有 由于它們都做了同樣的事情,它們都可以被命名為 "exit",但是當然,你不能有兩個具有相同名稱的方法(在同一個接收器上)。因此,我們需要以某種方式來區分這兩者。我們可以為這兩個方法中的一個想出一個完全不同的名字,但這也會讓人感到討厭。
因此,我們為這兩個方法中的一個添加一個 注意,這一切都與 "破壞性 "或 "變異 "無關。 特別是,一個方法沒有
標籤: 下一篇:我使用的是哪個Ruby版本?
!。
Process::exit和Process::exit! 它們都做同樣的事情(終止行程),但其中一個跳過了運行已安裝的退出處理程式。
!。現在,問題是:我們應該將!添加到這兩個方法中的哪一個?根據我們的慣例,"更令人驚訝 "的那個應該得到!。Ruby的開發者選擇了忽略退出處理程式的那一個,我認為這是正確的選擇:退出處理程式的全部意義在于當你退出時它們會被運行,所以一個沒有運行退出處理程式就退出的方法是令人驚訝的,因此應該用!來標記。
Process::exit!并沒有突變任何東西,也沒有破壞任何東西。還要注意的是,我們只用!來標記一個對方法中的更令人驚訝的方法。當沒有名為foo的方法時,就不應該有名為foo的方法。
!的事實并沒有告訴你關于這個方法的任何資訊。而一個有!的方法唯一告訴你的是有兩個方法,你也許應該檢查一下檔案,以確保你了解這兩個方法的作用,以及!警告你的 "驚喜 "是什么。就這樣了。
