`
like.eagle
  • 浏览: 248659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

symbol与ruby方法中的hash参数

    博客分类:
  • ruby
阅读更多

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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分享到:
评论

相关推荐

    Ruby常见面试题.pdf

    8. Ruby中的数组(Array)和哈希(Hash)有什么区别?请说明在Ruby中数组和哈希的不同特点。 9. 什么是Ruby中的块(Block)和迭代器(Iterator)?请简要介绍在Ruby中块和迭代器的概念。 10. 在Ruby中如何进行模块...

    Ruby菜鸟入门指南.md

    2. 符号(Symbol)的概念及作用,如用于Hash的键。 3. Ruby中"一切皆对象"的理念,数字、布尔值、类、nil等都是对象。 4. Ruby中"一切皆表达式"的设计,控制语句、方法定义等都会返回值。 5. Ruby中"一切皆方法调用",...

    ruby语法基础教程

    §3.4 特殊方法与特殊类 21 §3.5 类变量与类方法 23 §3.4 存取控制 23 §3.6 元类 25 §3.7 Ruby的动态性 26 §3.8 变量 26 §3.8.1 局部变量 27 §3.8.2 实例变量 27 §3.8.3 类变量 27 §3.8.4 全局变量 28 §...

    dio:Dio-深入对象-Ruby模式匹配接口,适用于尚无对象的对象

    用法转发器有三种核心类型,这是Dio工作原理的中心: 动态-使用public_send进行Hash匹配,并使用Array方法强制进行Array匹配属性-使用attr_*方法作为匹配数据的来源字符串哈希-为了匹配,将String哈希像Symbol哈希...

    exrb:Ruby-Elixir互操作性

    Symbol atom Exrb::NewReference或Exrb::Reference reference Exrb::Port port Exrb::Pid pid Exrb::Tuple tuple Hash map Exrb::ErlangNil [] Array `清单 Exrb::ImproperList improper_list utf...

    rschema:Ruby数据结构的基于模式的验证和强制

    Ruby数据结构的基于模式的验证和强制。 强烈地受到启发。 认识RSchema RSchema提供了一种描述,验证和强制数据“形状”的方法。 首先,您创建一个架构: blog_post_schema = RSchema.define_hash {{ title: _...

    ruby-marshal:Haskell库,用于解析使用Marshal.dump序列化的Ruby对象的子集

    Ruby元帅 Haskell库用于解析使用Marshal.dump序列化的Ruby对象的子集。 支持的类型 NilClass TrueClass | FalseClass Array Fixnum Float Hash String Symbol 如果您想增加对其他类型的支持,请随时使用...

    helper-methods

    辅助方法任务写一些测试阅读...我们已经知道该怎么做的清理工作在任何看到旧的Hash语法的地方( :symbol带有hash rockets => :symbol键):切换到。 看到任何地方:将其删除。 如有可能,删除render语句。 提供params键

    jsonapi-rspec:JSON的RSpec匹配器

    将以下内容添加到应用程序的Gemfile中: gem 'jsonapi-rspec' 然后执行: $ bundle 添加到您的spec/spec_helpers.rb : # spec/spec_helpers.rb require 'jsonapi/rspec' RSpec . configure do | config | ...

    enum_handler:RubyActiveRecord 工具,用于处理最好表示为枚举的模型属性

    枚举处理器 EnumHandler 帮助管理活动记录类的枚举。 假设实际值在数据库中存储为整数或字符串,但您希望在其余代码中使用符号。... define_enum :attribute, values_hash (symbol => underlying code), 例如: cl

Global site tag (gtag.js) - Google Analytics