作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 新手问一个语法的问题~??
时间Mon Oct 23 20:02:44 2006
※ 引述《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
1F:推 fuha:受教了~大感谢(感觉ruby语法变化很多~) 10/23 20:18