在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750 可以发现即使是同样内容的字符串"0001",在ruby解释器内部每次也都是当作不同的对象来处理的,这样随着字符中的调用次数增加,ruby解释器的负担不是越来越重,内存消耗越来越大? 有没有一种方法,让ruby在内部记录一下,如果遇到相同内容的字符串,就不用再生成新的String对象,而是直接取已经存在的对象返回呢?答案就是symbol 任何对象,只要在前面加个冒号(即":"),就能得到其对应的symbol,把上面的代码改成: puts :"0001".object_id puts :"0001".object_id puts :"0001".object_id puts :"0001".object_id 输出结果类似如下: 比较一下刚才的输出,会发现这次貌似四次调用,貌似全都共用了一个对象。 现在您大概能明白,为啥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)
输出结果: 1 让我们写得更"潮"一点,更ruby一点: my_method "1" , "2" , :title=>"标题" , :id=>123 效果完全相同,这个写法是不是跟link_to 'Show', :action => 'show', :id => product一样时尚了 :) |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论