如果刚刚学Ruby,看到attr_writer :foo 这样的东西是不是和我一样一头雾水,attr_writer是个方法不错,可:foo是个身马玩意儿...
:foo其实生成了一个Symbol对象的实例,你可以把Symbol对象看成是很cool的String,它没有String对象里面那些乱七八糟的方法,但是你可以把它当成String来用,因为他是immutable的,所以一旦你定义了:foo,在你的程序可以把它当成String来用十万次,十亿次。。。可是实例只有这一个,这样做的好处就是比用literal string节省内存。下面看一个attr_writer的模仿实现:
当然,你也可以用immutable的特性来定义常量。
:foo其实生成了一个Symbol对象的实例,你可以把Symbol对象看成是很cool的String,它没有String对象里面那些乱七八糟的方法,但是你可以把它当成String来用,因为他是immutable的,所以一旦你定义了:foo,在你的程序可以把它当成String来用十万次,十亿次。。。可是实例只有这一个,这样做的好处就是比用literal string节省内存。下面看一个attr_writer的模仿实现:
1 def customized_setter(prop)
2 eval <<-END
3 def #{prop}=(arg)
4 @#{prop} = arg
5 end
6 END
7 end
8
9 class Test
10 customized_setter :sym
11
12 def showSym
13 puts @sym
14 end
15
16 end
17
18 t = Test.new
19 t.sym = "FOO"
20 t.showSym
2 eval <<-END
3 def #{prop}=(arg)
4 @#{prop} = arg
5 end
6 END
7 end
8
9 class Test
10 customized_setter :sym
11
12 def showSym
13 puts @sym
14 end
15
16 end
17
18 t = Test.new
19 t.sym = "FOO"
20 t.showSym
当然,你也可以用immutable的特性来定义常量。