成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Ruby 2.0 有哪些新特性?

開發 前端
本月24日Ruby 2.0終于發布了。為什么有Ruby 2.0?因為我們在改變事物;我們渴望讓自己變得越來越快樂、健康、以及高產;不必畏懼。“擁抱變化”。

本月24日Ruby 2.0終于發布了。

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

(本文內容選譯自該幻燈片:https://speakerdeck.com/shyouhei/whats-new-in-ruby-2-dot-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. <code>%i(foo bar baz) # =&gt; [:foo, :bar, :baz] </code> 

·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. module AR::Helper  
  9.   def save  
  10.     foo  
  11.     super 
  12.     baz  
  13.   end 
  14. end  
  15. 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核心特性的介紹,參考

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標準庫的改進

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!

視頻:http://jpopsuki.tv/video/AKB48—Ruby/eb57d9ad12c4f7a324fc6854f673d40d (AKB48 演唱)

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

責任編輯:張偉 來源: Soi Mort 的博客
相關推薦

2013-02-26 09:36:57

RubyRuby 2.0

2021-06-23 09:46:16

Python 3.10結構模式管理器

2021-03-30 14:50:41

前端TypeScript 命令

2017-09-16 15:55:54

ChromeJavaScriptAndroid

2023-06-28 00:40:01

ECMAScriptWeakMapSymbol

2022-06-24 08:33:13

ECMAScriptjavaScript

2009-06-15 16:15:37

Spring2.0新特

2009-06-18 15:40:07

Spring Batc

2012-03-14 12:29:55

JavaPlay Framwo

2009-12-18 13:43:07

Ruby 1.9版本

2009-07-30 14:55:43

ASP.NET 2.0

2020-07-14 08:45:13

Flink特性jira

2021-11-17 10:45:58

Chrome 95新特性前端

2009-11-04 14:17:34

ADO.NET 2.0

2011-09-30 14:15:10

Sencha ToucSencha Touc

2012-07-02 10:43:49

JVMGroovyJava

2018-05-30 15:10:24

Spring BootList類型

2010-08-06 15:14:03

DB2 V9.5 新特

2012-03-24 21:02:41

iOS

2015-06-23 15:48:41

Swift 2.0iOS9
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜视频一区 | 欧美视频区 | 亚洲视频在线观看免费 | 欧美成年人网站 | 99国产精品久久久久久久 | 黄a网| 一区二区三区视频在线观看 | 精品视频成人 | 午夜码电影 | 欧美精品久久 | 7777奇米影视 | 成人免费激情视频 | 免费艹逼视频 | 亚洲精品中文在线 | 夜夜摸夜夜操 | 精品欧美一区二区三区精品久久 | 免费看大片bbbb欧美 | 中文字幕视频在线 | 日韩欧美国产不卡 | 在线看片网站 | 日韩中文一区 | 日本精品一区二区三区在线观看视频 | 91精品国产麻豆 | 欧美一区二区三区在线看 | 精品一区国产 | 国产高清在线观看 | 国产精品无码永久免费888 | 免费毛片网站 | 中文字幕一区二区三区在线观看 | 国产区在线 | 中文字幕亚洲区一区二 | 久草新在线 | 日本精品一区二区三区视频 | 欧美在线激情 | 伊人网国产 | 日韩国产欧美在线观看 | 中文字幕丁香5月 | 国产一区二区三区在线 | 亚洲三级在线观看 | 粉嫩高清一区二区三区 | 美女在线视频一区二区三区 |