国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Ruby 2.0發布 新特性介紹

開發 開發工具
Ruby2.0目前已經發布了,各位Ruby的粉絲們是否已經體驗過了?本文將介紹最新的Ruby2.0的一些新特性,到底有哪些變化呢,請詳細閱讀下文。

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

Ruby核心團隊的卜部昌平桑昨天在一個內部學習會上的presentation,介紹了Ruby 2.0所包含的一些新特性。

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

為什么有Ruby 2.0?

  • 因為我們在改變事物。

  • 我們渴望讓自己變得越來越快樂、健康、以及高產。

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

Ruby 2.0有什么新鮮的?

什么不是Ruby 2中的新鮮貨

  • 幾乎所有的東西。

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

    • 在現實中……
  • (舉個例子來說)Rails仍然能完好運行如初。

也就是說,

  • 新的東西被加進來了。

  • 許多內部的東西得到了改進。

Ruby 2.0的新句法

關鍵字參數(Keyword arguments)

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

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

但是,問題出在哪呢?

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

 
  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 

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

從2.0開始,Ruby將引入關鍵字參數:

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

其中a為固定參數,b為可選參數,c、d則為關鍵字參數。這樣,局部變量a、b、c和d都將被恰當地賦值。

在調用函數時,原有的調用方式無需更改。

Mort注:雖然幻燈片里沒有寫,傳統的基于Hash參數的調用方法是這個樣子的

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

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

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

更詳細的示例,可以參考這里:

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

其他細微的句法改進

  • 引入了符號數組字面值%i和%I。

 

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

 

  • Ruby現在默認把所有的輸入都視作UTF-8編碼。當然你也可以顯式地指定需要的編碼。

Ruby 2.0的核心性能改進

require的改進

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

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

    • 若干技術被應用于減少多余的計算上。

Backtrace惰性生成

  • 起初,backtraces只是字符串數組而已。

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

    • 這導致了超乎尋常的低效,尤其是當你有1024+個stack frames時(這在Rails應用中很常見)。
  • 從Ruby 2.x開始,Thread::Backtrace被用來取代字符串。

    • 它們非常地輕量級。
  • 當你需要查看backtrace時,只需將它們轉換成字符串即可(調用#to_s)。

Flonum類

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

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

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

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

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

GC(Garbage Collection)

  • Bitmap標志:以前,GC標志位存儲于每個對象中,但現在已經被轉移到了專用的內存頁中,以減少緩存的誤查詢(同時也更加CoW (Copy-on-Write)友好)。

  • 非遞歸標志:標志函數如今避免了機器棧溢出的風險。

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

Ruby 2.0的新核心特性:#1 調試工具

DTrace支持

TracePoint支持

GC stats

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

細粒度的異步中斷處理

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

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

 

  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 

 

模塊前插

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

 

  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  

 

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

惰性枚舉器

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

 

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

 

 

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

 

一個有趣的應用實例:無窮枚舉器。

 

  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轉換方法。
  • Random類(1.9+):可重復的PRNG。
  • IO#wait_writable:等待直到可寫。
  • Refinements: 實驗性的。

Mort注:更多關于Ruby 2.0核心特性的介紹,參考

Ruby 2.0標準庫的改進

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

總結

什么不是Ruby 2中的新鮮貨

  • 幾乎所有的東西!

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

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

  • 不必畏懼!開始使用2.0.0版吧!

也就是說,

  • 新的東西被加進來了。

  • 許多內部的東西得到了改進。

  • 即使你對你當前的環境充分自信,2.0.0仍然值得你擁有。

Don’t be afraid. Use Ruby today!

視頻:AKB48 - Ruby

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

責任編輯:林師授 來源: Mort Yao的博客
相關推薦

2009-06-16 11:25:57

phpMyAdmin

2019-03-05 10:27:53

Linux 系統 數據

2012-08-13 10:40:37

Ubuntu Twea操作系統

2025-08-20 12:13:06

2013-05-28 09:49:04

Hadoop 2.0大數據數據存儲

2013-02-25 14:02:07

RubyWeb

2011-10-14 06:58:30

Ubuntu 11.1特性

2009-04-01 08:53:34

JavaRebelJVM插件

2009-03-30 09:16:16

JBossSOAEclipse

2011-10-28 10:21:57

Ruby

2011-07-13 15:09:48

PHP

2014-09-12 10:46:35

Java9

2012-03-14 12:29:55

JavaPlay Framwo

2012-02-16 09:15:48

JavaJActor

2011-07-07 10:33:27

Ruby

2009-07-21 12:49:10

Ruby on RaiRoR

2011-10-10 09:56:43

Ruby

2012-02-29 10:54:21

JavaPlay Framew

2009-11-30 10:44:37

Debris LinuLinux

2012-05-11 10:42:56

JavaErrai
點贊
收藏

51CTO技術棧公眾號

视频一区二区精品| 久久久亚洲精品石原莉奈| 在线免费看黄av| 久久香蕉综合色| 九色精品免费永久在线| 欧美日高清视频| 成人av电影在线| 午夜国产一区二区| 99亚洲男女激情在线观看| 精品99又大又爽又硬少妇毛片 | 999视频在线免费观看| 亚洲精品ady| 欧美日韩一区二区在线| 日韩一区二区在线播放| 中文字幕久久精品| 美国三级日本三级久久99| 亚洲精品国产九九九| av白虎一区| 日本一二区视频| 99re6在线视频| 97天天综合网| 国产三级在线免费观看| 国产精品亚洲不卡a| 国产999在线| 在线观看18视频网站| yy111111少妇影院日韩夜片| 久久久国产成人精品| 国产精品乱码人人做人人爱| 欧美国产一级| 国产精品zjzjzj在线观看| 亚洲黄色免费看| 性亚洲最疯狂xxxx高清| bt7086福利一区国产| 国产91高潮流白浆在线麻豆| 国产福利电影一区二区三区| 成人精品免费网站| 国产不卡视频在线播放| 粉嫩av一区二区三区在线播放| 国产精品国产a| 精品久久久久久国产| 国产亚洲美州欧州综合国| 不卡一区二区三区四区| 日韩国产一区| 激情国产在线| 欧洲日本在线| 午夜免费性福利| 国产肥臀一区二区福利视频| 麻豆国产精品va在线观看不卡| 欧美成人午夜电影| 亚洲图片在区色| 欧美伦理91i| 成人欧美一区二区三区黑人孕妇 | 国产精品无码人妻一区二区在线| 成人一级片网站| 美州a亚洲一视本频v色道| 最新欧美日韩亚洲| 97精品久久久| 国产激情美女久久久久久吹潮| 欧美日韩免费一区二区三区视频| 欧美日韩免费一区| 日韩手机在线导航| 最近2019中文免费高清视频观看www99| 欧美精品生活片| 成人天堂噜噜噜| 综合视频免费看| 女生裸体视频网站免费观看| 成年人羞羞的网站| 欧美24videosex性欧美| 国产69精品久久久久9999人| 爽成人777777婷婷| 国产亚洲福利| 伊人一区二区三区| 亚洲国产一区二区三区四区| 欧美第一黄网免费网站| 亚洲视频在线观看日本a| 一级毛片免费看| 欧美gv在线观看| 欧美黄色一区二区| 欧美国产精品v| 一区二区三区鲁丝不卡| 欧美日韩一区二区欧美激情| 久久琪琪电影院| 男人添女人荫蒂免费视频| 日本中文字幕视频在线| 精品伊人久久久| 精彩视频一区二区| 亚洲成人精品一区| 久久视频免费观看| 欧美美女黄色网| 日本在线看片免费人成视1000| 欧美成人ⅴideosxxxxx| 天天综合国产| av电影天堂一区二区在线观看| 亚洲一区二区三区四区在线免费观看 | 欧美色图另类| 亚洲欧美视频一区二区| 粉嫩13p一区二区三区| 91精品国产91久久久久久最新毛片| 亚洲精品成a人在线观看| 成人欧美一区二区三区在线 | av男人的天堂网| 日韩午夜视频在线| av在线不卡观看免费观看| 777久久久精品| 国产高清一区视频| 色视频在线观看| 99人久久精品视频最新地址| 亚洲日本欧美日韩高观看| 九九精品在线播放| 加勒比海盗1在线观看免费国语版| av不卡高清| 成人免费福利片| 日日摸夜夜添一区| 国产午夜精品久久久久久久| 日韩欧美黄色影院| 91精品久久久久久久久久久久久久| 男人日女人视频网站| 久久精品资源| 99精品热6080yy久久| 欧美日韩国产另类一区| 波多野结衣精品久久| 免费a级毛片在线播放| 亚洲欧洲视频| 日韩电影在线观看永久视频免费网站| 国产精品9999久久久久仙踪林| 日本在线观看免费| 国产高清精品久久久久| 亚洲香蕉成人av网站在线观看| 香蕉视频禁止18| 欧美xxxx中国| 欧美sm极限捆绑bd| 国产激情在线观看视频| 91老司机福利在线| 久久国产福利国产秒拍| 久久久成人精品视频| 四虎影院在线域名免费观看| 精品国产一区二区三区久久久樱花| 欧美在线免费播放| 亚洲在线播放电影| 深爱激情综合| 精品蜜桃在线看| 欧美做暖暖视频| 18国产精品| 欧美午夜不卡视频| 超碰成人免费在线| 国产精品vip| 一本久久综合亚洲鲁鲁| 男人天堂资源在线| 2022国产精品视频| 亚洲高清乱码| 婷婷五月色综合香五月| 日韩黄在线观看| 超碰在线电影| 日本不卡在线视频| 欧美成人三级视频网站| 丝袜老师在线| 国产日产欧美一区二区三区 | 成人av免费在线看| 不卡av免费在线观看| 日韩电影在线观看电影| 丝袜亚洲另类丝袜在线| 国产伦理一区| 天堂久久久久va久久久久| 久久一日本道色综合久久| 久久av一区二区三区| 丝袜美腿亚洲综合| 老司机免费视频一区二区| 看片的网站亚洲| 久久9热精品视频| 国产在线一区观看| 大胆亚洲人体视频| 成人aa视频在线观看| 91在线精品一区二区| 国产欧美综合在线观看第十页| 国产亚洲欧美色| 自拍偷拍欧美激情| 亚洲成av人**亚洲成av**| 色噜噜偷拍精品综合在线| 欧美三级一区二区| 精品国产一区久久| 亚洲欧美另类人妖| 欧美成人中文字幕在线| 91精品国产色综合久久不卡98| 日韩av快播网址| av成人在线电影| 亚洲欧美国产不卡| 北条麻妃69av| 成人频在线观看| 日本暖暖在线视频| 国模冰冰炮一区二区| 久久视频社区| 精品香蕉视频| 免费中文字幕日韩欧美| 国产成人精品免费| 国产精品免费免费| 在线中文字幕一区二区| 精品一区二区三区四区| 欧美高清第一页| 成人免费视频观看视频| 一区二区三区四区免费视频|