• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby学习笔记(11)--symbol与hash参数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

symbol是啥就不深入的讨论了,只简单说说symbol的好处

ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看

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,把上面的代码改成:

puts  :"0001".object_id
puts  :"0001".object_id
puts  :"0001".object_id
puts  :"0001".object_id

输出结果类似如下:
155038
155038
155038
155038

比较一下刚才的输出,会发现这次貌似四次调用,貌似全都共用了一个对象。

现在您大概能明白,为啥Ror的应用中,到处充斥着类似下面的调用:

link_to 'Show', :action => 'show', :id => product

这里用:action而非action;用:id而非id的目的,就是上面提到的symbol的好处。

至于"=>"这个是什么意思,也就是下面要讲的哈希参数:

先来看一下哈希表(HashTable),这个跟c#中的没什么不同,基本上也就是一个"键-值"对的集合

products = {"0001"=>"手机","0002"=>"电脑"}

puts products["0001"]

输出结果:
手机

很好理解,不是么?但是结合上面讲的内容,如果以后多次用到 puts products["0001"],ruby内部会每次生成一个全新的"0001"字符串对象,所以一般没人这么用,应该改成这样:

products = {:"0001"=>"手机",:"0002"=>"电脑"}

puts products[:"0001"]

哈希参数指的其实就是在调用方法并传入参数时,可以将一个哈希表做为参数传入

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一点:

my_method "1" , "2" , :title=>"标题" , :id=>123 

效果完全相同,这个写法是不是跟link_to 'Show', :action => 'show', :id => product一样时尚了 :)

题外话:哈希参数与可选参数还是有些不同的(可选参数参见"


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
安装GitLab出现ruby_block[supervise_redis_sleep] action run发布时间:2022-07-14
下一篇:
ubuntu编译安装ruby1.9.3,从p551降级到p484发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap