溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Ruby 2.0 有哪些新特性

發(fā)布時間:2021-07-22 17:23:49 來源:億速云 閱讀:145 作者:chen 欄目:web開發(fā)

這篇文章主要介紹“Ruby 2.0 有哪些新特性”,在日常操作中,相信很多人在Ruby 2.0 有哪些新特性問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Ruby 2.0 有哪些新特性”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

本月24日Ruby 2.0終于發(fā)布了。

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

(本文內(nèi)容選譯自該幻燈片:https://speakerdeck.com/shyouhei/whats-new-in-ruby-2-dot-0 )

為什么有Ruby 2.0?

·因為我們在改變事物。

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

·不必畏懼?!皳肀ё兓?。”

Ruby 2.0有什么新鮮的?

什么不是Ruby 2中的新鮮貨

·幾乎所有的東西。

·“100%后向兼容”,matz如是說。

·在現(xiàn)實中……

·(舉個例子來說)Rails仍然能完好運行如初。

也就是說,

新的東西被加進(jìn)來了。

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

Ruby 2.0的新句法

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

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

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

但是,問題出在哪呢?

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

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

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

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

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ù)時,原有的調(diào)用方式無需更改。

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

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

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

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

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

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

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

·引入了符號數(shù)組字面值%i和%I。

<code>%i(foo bar baz) # =&gt; [:foo, :bar, :baz] </code>

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

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

require的改進(jìn)

&middot;背景:今天,由于我們有了許多gems,啟動Ruby有時甚至需要一次require 128+個庫&mdash;&mdash;這帶來了糟糕的性能問題。

&middot;解決:require變得更快了(從計算復(fù)雜度的意義上來說)。

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

Backtrace惰性生成

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

&middot;每當(dāng)拋出異常時,這些字符串就被自上而下地生成出來,即使在它們沒有實際用途的情況下。

&middot;這導(dǎo)致了超乎尋常的低效,尤其是當(dāng)你有1024+個stack frames時(這在Rails應(yīng)用中很常見)。

&middot;從Ruby 2.x開始,Thread::Backtrace被用來取代字符串。

&middot;它們非常地輕量級。

&middot;當(dāng)你需要查看backtrace時,只需將它們轉(zhuǎn)換成字符串即可(調(diào)用#to_s)。

Flonum類

&middot;在64位平臺(如今早就爛大街了)上,指針,整型和浮點型數(shù)均是64位寬度的。

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

&middot;問題:如何讓一個指針和一個double共存于一個union中?

&middot;解決:一些技巧性的位移。

Mort注:圖片懶得搬運了&hellip;&hellip;請參見原幻燈片。

GC(Garbage Collection)

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

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

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

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

DTrace支持

TracePoint支持

GC stats

Ruby 2.0的新核心特性:#2 核心庫

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

Ruby的執(zhí)行有時會因為各種原因而中斷,例如,超時。

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

Thread.async_interrupt_timing Timeout::Error => :defer do   timeout(rand()) do     begin       Thread.async_interrupt_timing Timeout::Error => :immediate do         setup          handle          ...        end     ensure       teardown      end   end end

模塊前插

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

module ActiveRecordHelper    def save      ???    end end

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

class Foo < AR::Base    prepend AR::Helper       def save      bar    end end module AR::Helper    def save      foo      super     baz    end end  Foo.new.save

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

惰性枚舉器

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

File.open(path) {|fp|      fp.each_line. \      select {|line| # 生成了臨時數(shù)組      /regexp/ =~ line      }. \      each_with_index.map {|line, no| # 生成了臨時數(shù)組      sprintf("%d: %s\n", no, line)      }. \      first(10).each {|str| # 生成了臨時數(shù)組          puts(str)      }  }
File.open(path) {|fp|      fp.each_line.lazy \      select {|line| # 沒有臨時數(shù)組產(chǎn)生      /regexp/ =~ line      }. \      each_with_index.map {|line, no| # 沒有臨時數(shù)組產(chǎn)生      sprintf("%d: %s\n", no, line)      }. \      first(10).each {|str| # 沒有臨時數(shù)組產(chǎn)生          puts(str)      }  } # 甚至在到達(dá)EOF之前都不讀取數(shù)據(jù)

一個有趣的應(yīng)用實例:無窮枚舉器。

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

其他的新方法

&middot;Kernel.__dir__:獲取__FILE__所在的目錄名。

&middot;Kernel#to_h:通用的Hash轉(zhuǎn)換方法。

&middot;Random類(1.9+):可重復(fù)的PRNG。

&middot;IO#wait_writable:等待直到可寫。

&middot;Refinements: 實驗性的。

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

http://globaldev.co.uk/2012/11/ruby-2-0-0-preview-features

http://www.infoq.com/news/2012/11/ruby-20-preview1

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

CGI

CGI已經(jīng)為HTML5做好了一切準(zhǔn)備。

net/http

支持SNI(Server Name Indication)。

Zlib綁定

Zlib如今運行在解釋器的進(jìn)程鎖之外。這意味著zlib在多線程的情形下運行速度將更快。

更新的stdlibs(標(biāo)準(zhǔn)庫)

Rubygems 2.0.0

JSON 1.7.7

Rake 0.9.5

Rdoc 4.0

以及其它(REXML,yaml,openssl&hellip;&hellip;)

到此,關(guān)于“Ruby 2.0 有哪些新特性”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI