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


    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一样时尚了 :)

    题外话:哈希参数与可选参数还是有些不同的(可选参数参见"ruby学习笔记(3)--语法层面的先见之明"),个人觉得哈希参数其实更灵活

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    安卓apk反编译、修改、重新打包、签名全过程
    Win10解决无法访问其他机器共享的问题
    VMware Pro v14.1.1 官方版本及激活密钥
    java发送http的get/post请求(一)
    Git忽略规则及.gitignore规则不生效的解决办法
    RouterOS视频教程下载
    Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
    去掉Word 标题编号变成黑框
    【分布式】分布式系统中的幂等性
    java反射(Reflection)的使用
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1678140.html
Copyright © 2020-2023  润新知