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)--语法层面的先见之明"),个人觉得哈希参数其实更灵活
- Git命令速记
- linux设备驱动第三篇:如何写一个简单的字符设备驱动
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
- Spring速查手册(三)——Spring+JDBC
- [WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析
- Spring速查手册(二)——Bean的作用域
- pyTorch自然语言处理简单例子
- 一文初探Tensorflow高级API使用(初学者篇)
- Spring速查手册——Bean装配
- 回溯法(一)——n皇后问题
- 图的邻接表示法Java版
- 图的遍历(BFS+DFS)
- 工厂模式
- Oracle 12.2新特性 | 基于权重的节点驱逐
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel自定义 封装便捷返回Json数据格式的引用方法
- Laravel模糊查询区分大小写的实例
- laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
- Laravel中validation验证 返回中文提示 全局设置的方法
- laravel5表单唯一验证的实例代码
- 实现laravel 插入操作日志到数据库的方法
- laravel validate 设置为中文的例子(验证提示为中文)
- Laravel 使用查询构造器配合原生sql语句查询的例子
- php面试实现反射注入的详细方法
- laravel框架 api自定义全局异常处理方法
- laravel实现于语言包的完美切换方法
- PHP校验15位和18位身份证号的类封装
- 用Echarts打造一个轮播图!
- Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
- PHP 获取客户端 IP 地址的办法实例代码