自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ruby 2.0發(fā)布 新特性介紹

開(kāi)發(fā) 開(kāi)發(fā)工具
Ruby2.0目前已經(jīng)發(fā)布了,各位Ruby的粉絲們是否已經(jīng)體驗(yàn)過(guò)了?本文將介紹最新的Ruby2.0的一些新特性,到底有哪些變化呢,請(qǐng)?jiān)敿?xì)閱讀下文。

本月24日(也就是明天)Ruby 2.0終于就要發(fā)布了。

Ruby核心團(tuán)隊(duì)的卜部昌平桑昨天在一個(gè)內(nèi)部學(xué)習(xí)會(huì)上的presentation,介紹了Ruby 2.0所包含的一些新特性。

(本文內(nèi)容選譯自該幻燈片。)

為什么有Ruby 2.0?

  • 因?yàn)槲覀冊(cè)诟淖兪挛铩?/p>

  • 我們渴望讓自己變得越來(lái)越快樂(lè)、健康、以及高產(chǎn)。

  • 不必畏懼。“擁抱變化。”

Ruby 2.0有什么新鮮的?

什么不是Ruby 2中的新鮮貨

  • 幾乎所有的東西。

  • “100%后向兼容”,matz如是說(shuō)。

    • 在現(xiàn)實(shí)中……
  • (舉個(gè)例子來(lái)說(shuō))Rails仍然能完好運(yùn)行如初。

也就是說(shuō),

  • 新的東西被加進(jìn)來(lái)了。

  • 許多內(nèi)部的東西得到了改進(jìn)。

Ruby 2.0的新句法

關(guān)鍵字參數(shù)(Keyword arguments)

下面的代碼在1.x中能夠正常工作:

 
  1. obj.method "with":lots => "of",  
  2.                    :args => "in",  
  3.                    :hash => "form" 

但是,問(wèn)題出在哪呢?

問(wèn)題是在定義該方法的時(shí)候: (Mort注:在Ruby 1.x中,只能將多個(gè)帶符號(hào)名稱(chēng)的參數(shù)作為一個(gè)Hash來(lái)傳遞給方法。要為參數(shù)指定默認(rèn)值,實(shí)現(xiàn)起來(lái)就很累贅,參見(jiàn)如下代碼)

 
  1. def obj.method(arg, hash)  
  2.   lots = Hash[:lots] || "default" 
  3.   args = Hash[:args] || "another" 
  4.   hand = Hash[:by hand] || "annoying" 
  5.   ...  
  6. end 

注意到代碼中錯(cuò)誤的Hash[:by hand]——手寫(xiě)代碼是錯(cuò)誤產(chǎn)生的根源!

從2.0開(kāi)始,Ruby將引入關(guān)鍵字參數(shù):

 
  1. def obj.method(a, b = 1, c: 1, d: 2) 

其中a為固定參數(shù),b為可選參數(shù),c、d則為關(guān)鍵字參數(shù)。這樣,局部變量a、b、c和d都將被恰當(dāng)?shù)刭x值。

在調(diào)用函數(shù)時(shí),原有的調(diào)用方式無(wú)需更改。

Mort注:雖然幻燈片里沒(méi)有寫(xiě),傳統(tǒng)的基于Hash參數(shù)的調(diào)用方法是這個(gè)樣子的

 
  1. obj.method("foo":c => 2, :d => 3) 

現(xiàn)在Ruby 2.0同時(shí)也支持直接采用關(guān)鍵字參數(shù)的調(diào)用方法:(Python程序員一定會(huì)覺(jué)得這種語(yǔ)法更親切)

 
  1. obj.method("foo", c: 2, d: 3) 

更詳細(xì)的示例,可以參考這里:

http://brainspec.com/blog/2012/10/08/keyword-arguments-ruby-2-0/

其他細(xì)微的句法改進(jìn)

  • 引入了符號(hào)數(shù)組字面值%i和%I。

 

  1. %i(foo bar baz) # => [:foo, :bar, :baz] 

 

  • Ruby現(xiàn)在默認(rèn)把所有的輸入都視作UTF-8編碼。當(dāng)然你也可以顯式地指定需要的編碼。

Ruby 2.0的核心性能改進(jìn)

require的改進(jìn)

  • 背景:今天,由于我們有了許多gems,啟動(dòng)Ruby有時(shí)甚至需要一次require 128+個(gè)庫(kù)——這帶來(lái)了糟糕的性能問(wèn)題。

  • 解決:require變得更快了(從計(jì)算復(fù)雜度的意義上來(lái)說(shuō))。

    • 若干技術(shù)被應(yīng)用于減少多余的計(jì)算上。

Backtrace惰性生成

  • 起初,backtraces只是字符串?dāng)?shù)組而已。

  • 每當(dāng)拋出異常時(shí),這些字符串就被自上而下地生成出來(lái),即使在它們沒(méi)有實(shí)際用途的情況下。

    • 這導(dǎo)致了超乎尋常的低效,尤其是當(dāng)你有1024+個(gè)stack frames時(shí)(這在Rails應(yīng)用中很常見(jiàn))。
  • 從Ruby 2.x開(kāi)始,Thread::Backtrace被用來(lái)取代字符串。

    • 它們非常地輕量級(jí)。
  • 當(dāng)你需要查看backtrace時(shí),只需將它們轉(zhuǎn)換成字符串即可(調(diào)用#to_s)。

Flonum類(lèi)

  • 在64位平臺(tái)(如今早就爛大街了)上,指針,整型和浮點(diǎn)型數(shù)均是64位寬度的。

  • 在Ruby中,指針和整型均為C級(jí)別的register寄存器變量。而double卻是存儲(chǔ)在內(nèi)存中的,如果我們能夠如操作指針一樣操作它們,將如何呢?

  • 問(wèn)題:如何讓一個(gè)指針和一個(gè)double共存于一個(gè)union中?

  • 解決:一些技巧性的位移。

Mort注:圖片懶得搬運(yùn)了……請(qǐng)參見(jiàn)原幻燈片。

GC(Garbage Collection)

  • Bitmap標(biāo)志:以前,GC標(biāo)志位存儲(chǔ)于每個(gè)對(duì)象中,但現(xiàn)在已經(jīng)被轉(zhuǎn)移到了專(zhuān)用的內(nèi)存頁(yè)中,以減少緩存的誤查詢(同時(shí)也更加CoW (Copy-on-Write)友好)。

  • 非遞歸標(biāo)志:標(biāo)志函數(shù)如今避免了機(jī)器棧溢出的風(fēng)險(xiǎn)。

  • 惰性清理(從1.9.3起):清理器只有在必須的地方才進(jìn)行收集(減少了stop時(shí)間)。

Ruby 2.0的新核心特性:#1 調(diào)試工具

DTrace支持

TracePoint支持

GC stats

Ruby 2.0的新核心特性:#2 核心庫(kù)

細(xì)粒度的異步中斷處理

Ruby的執(zhí)行有時(shí)會(huì)因?yàn)楦鞣N原因而中斷,例如,超時(shí)。

Ruby 2.0提供了細(xì)粒度的異步中斷處理方案:

 

  1. Thread.async_interrupt_timing Timeout::Error => :defer do 
  2.   timeout(rand()) do 
  3.     begin 
  4.       Thread.async_interrupt_timing Timeout::Error => :immediate do 
  5.         setup  
  6.         handle  
  7.         ...  
  8.       end 
  9.     ensure 
  10.       teardown  
  11.     end 
  12.   end 
  13. end 

 

模塊前插

有時(shí)候你想要給一個(gè)方法添加需要的安裝或拆解代碼,而相應(yīng)的部分卻定義在別處。

 

  1. module ActiveRecordHelper  
  2.   def save  
  3.     ???  
  4.   end 
  5. end 

 

該如何去做呢?在Ruby 2.0中,你可以:

 

  1. class Foo < AR::Base  
  2.   prepend AR::Helper  
  3.  
  4.   def save  
  5.     bar  
  6.   end 
  7. end 
  8.  
  9. module AR::Helper  
  10.   def save  
  11.     foo  
  12.     super 
  13.     baz  
  14.   end 
  15. end 
  16.  
  17. Foo.new.save  

 

這避開(kāi)了Rails中的所謂“別名方法鏈(alias method chain)”的困擾。AMC什么的已經(jīng)不再必要了。

惰性枚舉器

Ruby的foo.bar.baz. ...風(fēng)格(所謂的“流水作業(yè)”)有時(shí)會(huì)傳遞許多并不必要的臨時(shí)對(duì)象,而這些理論上都可以通過(guò)惰性求值來(lái)避免。

 

  1. File.open(path) {|fp|  
  2.     fp.each_line. \  
  3.     select {|line| # 生成了臨時(shí)數(shù)組  
  4.     /regexp/ =~ line  
  5.     }. \  
  6.     each_with_index.map {|line, no| # 生成了臨時(shí)數(shù)組  
  7.     sprintf("%d: %s\n", no, line)  
  8.     }. \  
  9.     first(10).each {|str| # 生成了臨時(shí)數(shù)組  
  10.         puts(str)  
  11.     }  

 

 

  1. File.open(path) {|fp|  
  2.     fp.each_line.lazy \  
  3.     select {|line| # 沒(méi)有臨時(shí)數(shù)組產(chǎn)生  
  4.     /regexp/ =~ line  
  5.     }. \  
  6.     each_with_index.map {|line, no| # 沒(méi)有臨時(shí)數(shù)組產(chǎn)生  
  7.     sprintf("%d: %s\n", no, line)  
  8.     }. \  
  9.     first(10).each {|str| # 沒(méi)有臨時(shí)數(shù)組產(chǎn)生  
  10.         puts(str)  
  11.     }  
  12. # 甚至在到達(dá)EOF之前都不讀取數(shù)據(jù) 

 

一個(gè)有趣的應(yīng)用實(shí)例:無(wú)窮枚舉器。

 

  1. # Leibniz formula for π  
  2. (0..Float::INFINITY).lazy.map {|i|  
  3.     ((-1) ** i) / (2*i + 1).to_f  
  4. }.take(65536).reduce(:+) * 4 

 

其他的新方法

  • Kernel.__dir__:獲取__FILE__所在的目錄名。
  • Kernel#to_h:通用的Hash轉(zhuǎn)換方法。
  • Random類(lèi)(1.9+):可重復(fù)的PRNG。
  • IO#wait_writable:等待直到可寫(xiě)。
  • Refinements: 實(shí)驗(yàn)性的。

Mort注:更多關(guān)于Ruby 2.0核心特性的介紹,參考

Ruby 2.0標(biāo)準(zhǔn)庫(kù)的改進(jìn)

  • CGI
    • CGI已經(jīng)為HTML5做好了一切準(zhǔn)備。
  • net/http
    • 支持SNI(Server Name Indication)。
  • Zlib綁定
    • Zlib如今運(yùn)行在解釋器的進(jìn)程鎖之外。這意味著zlib在多線程的情形下運(yùn)行速度將更快。
  • 更新的stdlibs(標(biāo)準(zhǔn)庫(kù))
    • Rubygems 2.0.0
    • JSON 1.7.7
    • Rake 0.9.5
    • Rdoc 4.0
    • 以及其它(REXML,yaml,openssl……)

總結(jié)

什么不是Ruby 2中的新鮮貨

  • 幾乎所有的東西!

  • “100%后向兼容”,matz如是說(shuō)。

  • (舉個(gè)例子來(lái)說(shuō))Rails仍然能完好運(yùn)行如初。

  • 不必畏懼!開(kāi)始使用2.0.0版吧!

也就是說(shuō),

  • 新的東西被加進(jìn)來(lái)了。

  • 許多內(nèi)部的東西得到了改進(jìn)。

  • 即使你對(duì)你當(dāng)前的環(huán)境充分自信,2.0.0仍然值得你擁有。

Don’t be afraid. Use Ruby today!

視頻:AKB48 - Ruby

原文鏈接:http://www.soimort.org/posts/140/

責(zé)任編輯:林師授 來(lái)源: Mort Yao的博客
相關(guān)推薦

2019-03-05 10:27:53

Linux 系統(tǒng) 數(shù)據(jù)

2009-06-16 11:25:57

phpMyAdmin

2012-08-13 10:40:37

Ubuntu Twea操作系統(tǒng)

2013-02-25 14:02:07

RubyWeb

2013-05-28 09:49:04

Hadoop 2.0大數(shù)據(jù)數(shù)據(jù)存儲(chǔ)

2011-10-14 06:58:30

Ubuntu 11.1特性

2011-10-28 10:21:57

Ruby

2009-03-30 09:16:16

JBossSOAEclipse

2009-04-01 08:53:34

JavaRebelJVM插件

2012-03-14 12:29:55

JavaPlay Framwo

2014-09-12 10:46:35

Java9

2012-02-16 09:15:48

JavaJActor

2011-07-13 15:09:48

PHP

2011-07-07 10:33:27

Ruby

2011-10-10 09:56:43

Ruby

2009-07-21 12:49:10

Ruby on RaiRoR

2009-11-30 10:44:37

Debris LinuLinux

2011-03-30 14:29:13

QuartzJava

2011-10-18 15:00:46

Perl

2012-05-11 10:42:56

JavaErrai
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)