`

Ruby 1.9.1 和1.8.6 Hash描述的差异

阅读更多
在哈希表的描述上ruby 1.9.1,有很很大的改变,下面是一些值得关注的部分:

RUBY_VERSION => 1.8.6

>> {'name', "Akhil"}  
=> {"name"=>"Akhil"}  
>> {'name', "Akhil"}
=> {"name"=>"Akhil"}


RUBY_VERSION => 1.9.1

>> {'name', "Akhil"}  
=> syntax error, unexpected ',', expecting tASSOC  
  
>> {name: "Akhil"}  
=> {:name=>"Akhil"}  
>> {'name', "Akhil"}
=> syntax error, unexpected ',', expecting tASSOC

>> {name: "Akhil"}
=> {:name=>"Akhil"}

新的Hash加强了对序列处理

RUBY_VERSION => 1.8.6


>> hash = {:a=> 'A', :b=>'B', :c=>'C', :d=>'D'}  
=> {:b=>"B", :c=>"C", :d=>"D", :a=>"A"}  
>> hash.to_a  
=> [[:b, "B"], [:c, "C"], [:d, "D"], [:a, "A"]]  
>> hash.keys  
=> [:b, :c, :d, :a]  
>> hash.values  
=> ["B", "C", "D", "A"]  
>> hash = {:a=> 'A', :b=>'B', :c=>'C', :d=>'D'}
=> {:b=>"B", :c=>"C", :d=>"D", :a=>"A"}
>> hash.to_a
=> [[:b, "B"], [:c, "C"], [:d, "D"], [:a, "A"]]
>> hash.keys
=> [:b, :c, :d, :a]
>> hash.values
=> ["B", "C", "D", "A"]


RUBY_VERSION => 1.9.1


>> hash = {:a=> 'A', :b=>'B', :c=>'C', :d=>'D'}  
=> {:a=>"A", :b=>"B", :c=>"C", :d=>"D"}  
>> hash.to_a  
=> [[:a, "A"], [:b, "B"], [:c, "C"], [:d, "D"]]  
>> hash.keys  
=> [:a, :b, :c, :d]  
>> hash.values  
=> ["A", "B", "C", "D"]  
>> hash = {:a=> 'A', :b=>'B', :c=>'C', :d=>'D'}
=> {:a=>"A", :b=>"B", :c=>"C", :d=>"D"}
>> hash.to_a
=> [[:a, "A"], [:b, "B"], [:c, "C"], [:d, "D"]]
>> hash.keys
=> [:a, :b, :c, :d]
>> hash.values
=> ["A", "B", "C", "D"]


有点像hash.inspect,更好的to_s方法

RUBY_VERSION => 1.8.6


>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:b=>2, :c=>3, :d=>4, :a=>1}  
>> hash.to_s  
=> "b2c3d4a1"  
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}
=> {:b=>2, :c=>3, :d=>4, :a=>1}
>> hash.to_s
=> "b2c3d4a1"


RUBY_VERSION => 1.9.1

>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:a=>1, :b=>2, :c=>3, :d=>4}  
>> hash.to_s  
=> "{:a=>1, :b=>2, :c=>3, :d=>4}"  
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
>> hash.to_s
=> "{:a=>1, :b=>2, :c=>3, :d=>4}"


hash.each 和 hash.each_pair 的表达

RUBY_VERSION => 1.8.6
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:b=>2, :c=>3, :d=>4, :a=>1}  
>> hash.each{|x| p x}  
[:b, 2]  
[:c, 3]  
[:d, 4]  
[:a, 1]  
=> {:b=>2, :c=>3, :d=>4, :a=>1}  
>> hash.each_pair{|x| p x}  
(irb):48: warning: multiple values for a block parameter (2 for 1)  
        from (irb):48  
[:b, 2]  
(irb):48: warning: multiple values for a block parameter (2 for 1)  
        from (irb):48  
[:c, 3]  
(irb):48: warning: multiple values for a block parameter (2 for 1)  
        from (irb):48  
[:d, 4]  
(irb):48: warning: multiple values for a block parameter (2 for 1)  
        from (irb):48  
[:a, 1]  
=> {:b=>2, :c=>3, :d=>4, :a=>1}  
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}
=> {:b=>2, :c=>3, :d=>4, :a=>1}
>> hash.each{|x| p x}
[:b, 2]
[:c, 3]
[:d, 4]
[:a, 1]
=> {:b=>2, :c=>3, :d=>4, :a=>1}
>> hash.each_pair{|x| p x}
(irb):48: warning: multiple values for a block parameter (2 for 1)
        from (irb):48
[:b, 2]
(irb):48: warning: multiple values for a block parameter (2 for 1)
        from (irb):48
[:c, 3]
(irb):48: warning: multiple values for a block parameter (2 for 1)
        from (irb):48
[:d, 4]
(irb):48: warning: multiple values for a block parameter (2 for 1)
        from (irb):48
[:a, 1]
=> {:b=>2, :c=>3, :d=>4, :a=>1}


RUBY_VERSION => 1.9.1


>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:a=>1, :b=>2, :c=>3, :d=>4}  
>> hash.each{|x| p x}  
[:a, 1]  
[:b, 2]  
[:c, 3]  
[:d, 4]  
=> {:a=>1, :b=>2, :c=>3, :d=>4}  
>> hash.each_pair{|x| p x}  
[:a, 1]  
[:b, 2]  
[:c, 3]  
[:d, 4]  
=> {:a=>1, :b=>2, :c=>3, :d=>4}  
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
>> hash.each{|x| p x}
[:a, 1]
[:b, 2]
[:c, 3]
[:d, 4]
=> {:a=>1, :b=>2, :c=>3, :d=>4}
>> hash.each_pair{|x| p x}
[:a, 1]
[:b, 2]
[:c, 3]
[:d, 4]
=> {:a=>1, :b=>2, :c=>3, :d=>4}


hash.select现在会返回hash而不是array

RUBY_VERSION => 1.8.6

>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:b=>2, :c=>3, :d=>4, :a=>1}  
>> hash.select{|k,v| k == :c }  
=> [[:c, 3]]  
>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}
=> {:b=>2, :c=>3, :d=>4, :a=>1}
>> hash.select{|k,v| k == :c }
=> [[:c, 3]]


RUBY_VERSION => 1.9.1


>> hash = {:a=> 1, :b=>2, :c=>3, :d=>4}  
=> {:a=>1, :b=>2, :c=>3, :d=>4}  
>>  hash.select{|k,v| k == :c }  
=> {:c=>3}  

分享到:
评论
2 楼 rainux 2009-03-25  
night_stalker 写道
在1.9,Hash的实现从单链表改成了双向循环链表。

struct st_table_entry {
  unsigned int hash;
  st_data_t key;
  st_data_t record;
  st_table_entry *next;
  st_table_entry *fore, *back; //加了这一行
};

注:st_table不仅是Hash的基础,还是Object的基础。


理论上讲,由于需要改动更多的指针,插入和删除的性能降低了,但是双向指针提供了有序化列表项的能力,而且提升了遍历的性能。

不过一些benchmark表示,连插入和删除都略有提升。


我觉得 Hash 最有意义的改进就是内容有序化了。
1 楼 night_stalker 2009-03-25  
在1.9,Hash的实现从单链表改成了双向循环链表。

struct st_table_entry {
  unsigned int hash;
  st_data_t key;
  st_data_t record;
  st_table_entry *next;
  st_table_entry *fore, *back; //加了这一行
};

注:st_table不仅是Hash的基础,还是Object的基础。


理论上讲,由于需要改动更多的指针,插入和删除的性能降低了,但是双向指针提供了有序化列表项的能力,而且提升了遍历的性能。

不过一些benchmark表示,连插入和删除都略有提升。

相关推荐

    ruby1.9.1文档和一本pdf

    Ruby 1.9.1 是 Ruby 语言的一个重要版本,发布于2009年,它带来了许多重要的改进和更新,对于理解这个编程语言的发展历程至关重要。本压缩包包含的资源是关于 Ruby 1.9.1 的文档和一本 PDF 文件,可能是对该版本的...

    Ruby1.9.1released.zip

    ruby 1.9.1 的下载地址是:ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz (windows上在http://www.ruby-lang.org/en/downloads/ 下载二进制的文件)另外,目前Rails 2.2还无法在ruby 1.9.1上面正常...

    适合Ruby 1.9.1的Ruby-FCGI源码包

    因此,这个特别的源码包是针对Ruby 1.9.1进行过适配和修改的,确保在该版本下能够顺利安装和运行。 在源码包`ruby-fcgi-0.8.7`中,你可以期待找到以下关键文件和目录: 1. `ext/`: 这个目录包含了Ruby-FCGI的C语言...

    【工作点滴】用VS 2010 编译 Ruby 1.9.1

    线程是程序执行的并行单元,Ruby 1.9.1中引入了改进的线程模型,因此这个测试可能验证了Ruby解释器对多线程的支持和性能。 总的来说,这个主题提供了关于如何在Windows平台上利用Visual Studio这样的专业开发工具...

    ruby-1.9.1-p0-i386-mswin32.zip

    6. doc:文档目录,可能包含Ruby 1.9.1的官方文档、API参考或者其他帮助文件,对于学习和开发非常有帮助。 7. lib:库目录,存储了Ruby标准库和其他库文件,这些文件提供了各种内置模块和类,使得开发者可以利用...

    ruby-1.9.1-p0-i386-mswin32.rar

    Ruby 1.9.1中已经内置了JSON支持,能够方便地进行JSON数据的编码和解码。 5. 配置脚本和安装向导:指导用户完成安装过程,并根据用户的系统配置进行适当的设置。 6. 文档:包括API参考、教程和示例代码,帮助用户...

    Ruby1.91_Stable和Gem1.3.5

    Ruby 1.9.1 和 Gem 1.3.5 是 Ruby 编程语言的关键版本,它们在软件开发中扮演着重要角色。Ruby 1.9.1 是 Ruby 的一个稳定分支,它引入了许多改进和新特性,提升了性能并增强了语言的规范性。 Ruby 1.9.1 的主要更新...

    mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe

    mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe

    windows下安装Ruby 1.9 二进制zip包

    这个zip包通常包含了Ruby解释器以及必要的库文件,例如`libeay32.dll`、`ssleay32.dll`、`libssl32.dll`、`readline5.dll`和`zlib.dll`。这些库文件在Ruby运行时扮演着至关重要的角色: 1. `libeay32.dll` 和 `...

    ruby安装升级及命令自行编译安装非APTGET方式安装升级的办法

    ### Ruby的手动编译安装与升级方法 #### 引言 Ruby是一种动态、面向对象的脚本语言...通过上述步骤,不仅能够实现Ruby的定制化安装与升级,还能够利用RubyGems方便地管理Ruby扩展包,极大地提升了开发效率和灵活性。

    texplay:ruby 和 gosu 的图像处理工具

    安装 1.9.1 和 1.8.6 mingw ruby​​ 版本(上面的说明) 类型(在 Linux/OSX 上构建胖 Win32 二进制文件): rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1 将新宝石上传到 ruby​​forge 和 gemcutter。 ...

    ruby-1.9.1-p376-i386-mswin32.zip

    The Windows platform has several options for installing Ruby. The first option is simply installing the compiled binaries. The second option is to use the one-click installer. If you’re unsure about ...

    doxygen1.9.1.zip

    Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C、C++、Java、Objective-C和IDL语言,部分支持PHP、C#。注释的语法与Qt-Doc、KDoc和JavaDoc兼容。Doxygen可以从一套归档源文件开始,生成...

    jquery-1.9.1(js和min.js下载)

    2. min.js文件(通常命名为jquery-1.9.1.min.js)是经过压缩和优化后的版本,通过删除不必要的空格、换行和注释,以及合并变量等方式减小文件大小,从而加快页面加载速度。在生产环境中,应优先考虑使用min.js,以...

    jQuery1.9.1含jquery-1.9.1-vsdoc

    同时,1.9.1版本引入了一些新的API和改进,如`.on()`和`.off()`方法,它们替代了之前的事件绑定和解绑方法,增强了事件处理的灵活性。 此外,jQuery 1.9.1在性能上也有所提升,优化了DOM操作和事件处理的效率。例如...

    jquery-1.9.1.js 、jquery-1.9.1.min.js 【官方jquery包 js】

    `jquery-1.9.1.js`是未压缩的源代码版本,便于开发者阅读、调试和学习,而`jquery-1.9.1.min.js`是经过压缩和优化后的版本,体积更小,适用于生产环境,以提高页面加载速度。 jQuery 1.9.1版本是一个重要的里程碑,...

    Ruby工具 windows 环境

    Ruby是一种面向对象的脚本语言,它以其简洁、优雅的语法和强大的编程能力而闻名。在Windows环境下设置和使用Ruby工具对于开发者来说是一项基础任务。本文将深入探讨Ruby在Windows平台上的安装、配置以及基本使用。 ...

    ubuntu系统指定位置一键安装pcl1.9.1和有关的依赖库

    1.chmod + x pcl.sh#增加可执行权限 2../pcl.sh#安装在/usr/local/pcl/pcl-1.9.1 3.sudo gedit .bashrc 4.添加export PCL_DIR=/usr/local/pcl/pcl-1.9.1

    shiro1.9.1源码及jar

    目前无漏洞版本shiro1.9.1源码+jar

Global site tag (gtag.js) - Google Analytics