概述
symbol与ruby方法中的hash参数
【转载地址】http://www.cnblogs.com/yjmyzz/archive/2010/03/04/1678140.html
symbol是啥就不深入的讨论了,只简单说说symbol的好处
ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看
1
2
3
4
|
puts
"0001"
.object_id
puts
"0001"
.object_id
puts
"0001"
.object_id
puts
"0001"
.object_id
|
输出结果类似如下:
32088750
32088730
32088710
32088690
可以发现即使是同样内容的字符串"0001",在ruby解释器内部每次也都是当作不同的对象来处理的,这样随着字符中的调用次数增加,ruby解释器的负担不是越来越重,内存消耗越来越大?
有没有一种方法,让ruby在内部记录一下,如果遇到相同内容的字符串,就不用再生成新的String对象,而是直接取已经存在的对象返回呢?答案就是symbol
任何对象,只要在前面加个冒号(即":"),就能得到其对应的symbol,把上面的代码改成:
1
2
3
4
|
puts :
"0001"
.object_id
puts :
"0001"
.object_id
puts :
"0001"
.object_id
puts :
"0001"
.object_id
|
输出结果类似如下:
155038
155038
155038
155038
比较一下刚才的输出,会发现这次貌似四次调用,貌似全都共用了一个对象。
现在您大概能明白,为啥Ror的应用中,到处充斥着类似下面的调用:
1
|
link_to
'Show'
,
:action
=>
'show'
,
:id
=> product
|
这里用:action而非action;用:id而非id的目的,就是上面提到的symbol的好处。
至于"=>"这个是什么意思,也就是下面要讲的哈希参数:
先来看一下哈希表(HashTable),这个跟c#中的没什么不同,基本上也就是一个"键-值"对的集合
1
2
3
|
products = {
"0001"
=>
"手机"
,
"0002"
=>
"电脑"
}
puts products[
"0001"
]
|
输出结果:
手机
很好理解,不是么?但是结合上面讲的内容,如果以后多次用到 puts products["0001"],ruby内部会每次生成一个全新的"0001"字符串对象,所以一般没人这么用,应该改成这样:
1
2
3
|
products = {:
"0001"
=>
"手机"
,:
"0002"
=>
"电脑"
}
puts products[:
"0001"
]
|
哈希参数指的其实就是在调用方法并传入参数时,可以将一个哈希表做为参数传入
1
2
3
4
5
6
7
|
def
my_method(p1,p2,options={})
puts p1
puts p2
options.
each
{|key,value| puts
"#{key} is #{value}"
}
end
my_method(
"1"
,
"2"
,
:title
=>
"标题"
,
:id
=>
123
)
|
参数定义中我们用options={}定义了一个空的hash集合,这样在调用时,可以传入任意的 xx=>yy,aa=>bb,11==>22... 参数,是不是很灵活?
输出结果:
1
2
title is 标题
id is 123
让我们写得更"潮"一点,更ruby一点:
1
|
my_method
"1"
,
"2"
,
:title
=>
"标题"
,
:id
=>
123
|
效果完全相同,这个写法是不是跟link_to 'Show', :action => 'show', :id => product一样时尚了 :)
题外话:哈希参数与可选参数还是有些不同的(可选参数参见"ruby学习笔记(3)--语法层面的先见之明 "),个人觉得哈希参数其实更灵活
出处: http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
最后
以上就是妩媚中心为你收集整理的symbol与ruby方法中的hash参数的全部内容,希望文章能够帮你解决symbol与ruby方法中的hash参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复