[問題] downcase 與 downcase! 的差異?
※ 引述《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
10/23 20:18, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章