[問題] downcase 與 downcase! 的差異?

看板Ruby作者 (godfat 真常)時間18年前 (2006/10/23 18:56), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《fuha (mimi)》之銘言: : ex : s = "DDee" : puts s.downcase : 答案會是 "ddee" : 我有問題的是 : 書本上他是寫成 puts s.downcase! : 答案也是 "ddee" 請問這兩個有什麼差別嗎???? 在 Ruby 中,以 "!" 結尾是合法的 method 命名方式("!" 也僅限結尾可用) 所以這裡其實是兩個不同的 method, 一個是 downcase, 另一個是 downcase! 再來就是以 "!" 結尾的意義了,這算是一種習慣 假使 method 沒有以 "!" 結尾,則此 method 會複製一份 instance 回傳 假使 method 以 "!" 結尾,則此 method 產生的效果是在本體(self)上 以你的題目來看, s = "DDee" puts s.downcase # 輸出 ddee puts s # 輸出 DDee puts s.downcase! # 輸出 ddee puts s # 輸出 ddee 也就是說,沒有以 "!" 結尾的 method 是沒有 side-effect 的(本例中) 至於兩個 method 的實作法,通常由其中一個呼叫另一個,如 def test! do_something end def test self.dup.test! end 把自己複製一份,然後對那份做變化性操作 這邊應該可以藉由 metaprogramming 做自動性產生 :) 類似這樣…? 輸出結果: 6 5 6 6 class Module def make! symbol, callback module_eval" def #{symbol.to_s}! self.send :#{callback.to_s} end def #{symbol.to_s} self.dup.send :#{callback.to_s} end" end end class Test attr_reader :v private def todo @v += 1 self end make! :go, :todo def initialize input @v = input end end t = Test.new 5 puts t.go.v puts t.v puts t.go!.v puts t.v -- 生死去来、棚頭傀儡、一線断時、落落磊磊 《花鏡》-世阿弥 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.85.2

10/23 20:18, , 1F
受教了~大感謝(感覺ruby語法變化很多~)
10/23 20:18, 1F
文章代碼(AID): #15F9_cfb (Ruby)
討論串 (同標題文章)
文章代碼(AID): #15F9_cfb (Ruby)