`
like.eagle
  • 浏览: 253129 次
  • 性别: 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中的Symbol

    ### 符号的优雅:深入探索 Ruby 中的 Symbol #### 引言 在 Ruby 这门优雅且功能强大的编程语言中,符号(Symbol)占据着举足轻重的地位。符号不仅是 Ruby 性能优化的关键组成部分,也是理解 Ruby 核心特性的窗口之...

    ruby中文手册 chm

    这部分通常是对Ruby内置类库、方法、语法的详细参考,涵盖了标准库的所有模块和类,比如Array、Hash、String等。它提供了每个方法的用法、参数和返回值,是开发者在编写代码时查找特定功能或方法的重要资源。 3. *...

    Ruby语言中文教程

    Ruby支持块参数,使得方法能够接受代码块作为参数,这在处理迭代或回调时非常有用。此外,Ruby还有lambda和proc,它们是可调用的对象,类似于匿名函数。 类和模块是Ruby中的核心概念。类定义了对象的行为和状态,而...

    ruby中文教程(源代码)

    - 数据类型:Ruby是动态类型语言,主要数据类型包括字符串(`String`)、整数(`Integer`)、浮点数(`Float`)、布尔值(`TrueClass`和`FalseClass`)、数组(`Array`)、哈希(`Hash`)、符号(`Symbol`)等。...

    在Ruby中创建和使用哈希的教程

    在Ruby编程语言中,哈希(Hash)是一种特殊的数据结构,用于存储键值对(key-value pairs)。在本教程中,我们将详细介绍如何在Ruby中创建和使用哈希,罗列各种方法和技巧,并解释哈希的特性。 ### 理解哈希的基本...

    learning-ruby.

    3. **函数与方法**:Ruby中的函数称为方法,可以定义全局方法或类方法。了解如何定义、调用和传递参数是学习Ruby的重要部分。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,每个值都是一个对象,每种类型都是...

    ruby入门练习题.zip

    3. **类与对象**:在Ruby中,你可以定义自己的类,比如`Person`,然后通过`new`方法创建该类的对象。类包含属性(或称为实例变量)和方法(或称为成员函数)。 4. **方法**:Ruby的方法可以看作是可重用的代码块,...

    ruby trap 初学者使用

    - Ruby中的块(由`do...end`或`{...}`定义)是代码的可执行部分,可以与方法一起使用。Proc和Lambda是块的两种对象形式,它们可以保存并稍后执行。理解它们的差异,如 Proc的`call`和Lambda的`[]`调用方式,以及对...

    ruby官方chm文档

    《ruby23-language.chm》文档深入讲解了Ruby语言的特性,如动态性、元编程、闭包和块、方法定义与调用、变量作用域等。Ruby允许在运行时修改代码,这使得元编程成为其强大之处。理解如何使用`eval`、`class_eval`和`...

    Ruby学习资料chm

    6. Symbol:Ruby中的Symbol是不可变的对象,用于表示常量,减少内存开销,提高性能。 7. Mixins:Ruby的模块(Module)系统允许代码复用,模块可以被多个类包含,实现类似多重继承的功能。 8. 自动类型推断:Ruby...

    ruby语法

    3. **方法定义**: Ruby中的方法定义以`def`开始,后跟方法名,参数列表,然后是方法体,最后用`end`结束。例如: ```ruby def say_hello(name) puts "Hello, #{name}" end ``` 4. **控制结构**: Ruby有标准的...

    Programming Ruby 1.9 (3rd edition)和源码

    - 类与对象:Ruby中的万物皆对象,每个类都是Object类的子类。 - 继承与模块:Ruby支持单继承,但可以通过模块实现多重继承的效果,提供代码重用。 - 方法定义:包括实例方法、类方法、定义私有和保护方法等。 -...

    RUBY中文教程

    Ruby还支持符号(Symbol)和数组(Array)、哈希(Hash)等复杂数据结构。 3. **控制结构** - 条件语句:`if`、`unless`、`case`用于条件判断。 - 循环:`for`、`while`、`until`以及`each`方法用于循环。 - `...

    ruby初学者教程(对初学者很有帮助)

    特殊方法是指那些在Ruby中具有特殊含义的方法,例如`initialize`、`==`等。 **3.5 类变量与类方法** 类变量是以`@@`开头的变量,可以在类的所有实例之间共享。类方法则是定义在类本身上的方法。 ```ruby class ...

    ruby语法自整理

    以上只是Ruby语法的一部分,Ruby还有许多其他特性,如方法定义、块(block)、 Proc 对象、Lambda、符号(Symbol)、哈希(Hash)等,都是Ruby强大之处的体现。学习Ruby,理解并熟练运用这些基础语法是成为有效...

    ruby中文文档

    5. **符号(Symbol)**:Ruby中的符号是不可变的字符串引用,它们在内存中只保存一份,常用于创建哈希键或方法名。 6. **数组(Array)和哈希(Hash)**:Ruby提供了强大的数组和哈希数据结构,支持多种操作,如...

Global site tag (gtag.js) - Google Analytics