NEWS for Ruby 2.0.0¶ ↑
此文件列出版本間使用者可見的功能變更,不包括錯誤修正。
請注意,每個條目都簡短到沒有提供背後原因或參考資訊。如需包含所有足夠資訊的完整變更清單,請參閱變更日誌檔。
自 1.9.3 版本以來的變更¶ ↑
語言變更¶ ↑
-
新增關鍵字參數。
-
新增 %i 和 %I 用於建立符號清單(類似於 %w 和 %W)。
-
預設來源編碼已變更為 UTF-8。(之前為 US-ASCII)
-
不會對以「_」開頭的未使用變數發出警告
核心類別更新(僅限傑出的類別)¶ ↑
-
-
新增方法
-
新增 ARGF#codepoints 和
ARGF#each_codepoint
,就像IO
的對應方法。
-
-
-
-
新增方法
-
新增
Array#bsearch
用於二元搜尋。
-
-
不相容的變更
-
Array#shuffle!
和Array#sample
的隨機參數現在會使用一個參數(最大值)呼叫。 -
當給予
Range
參數時,Array#values_at
現在會對每個超出範圍的值傳回 nil。
-
-
-
-
新增方法
-
新增
Enumerable#lazy
方法用於延遲列舉。
-
-
-
-
新增方法
-
新增
Enumerator#size
用於延遲大小評估。
-
-
延伸方法
-
Enumerator.new
接受一個參數用於延遲大小評估。
-
-
新類別
Enumerator::Lazy
用於延遲列舉
-
-
-
別名方法
-
ENV.to_h
是ENV.to_hash
的新別名
-
-
-
-
不相容的變更
-
Fiber#resume
無法繼續呼叫「Fiber#transfer」的 Fiber。
-
-
-
-
延伸方法
-
File.fnmatch?
現在會在模式中展開大括號,如果給予 File::FNM_EXTGLOB 選項。
-
-
-
-
改進
-
引入了位元圖標記,用於抑制使用寫入時複製複製記憶體頁面。
-
引入了非遞迴標記,以避免意外堆疊溢位。
-
-
-
-
新增方法
-
新增
GC::Profiler.raw_data
,它會傳回GC
的原始剖析資料。
-
-
-
-
新增方法
-
新增
Hash#to_h
作為明確轉換方法,例如Array#to_a
。
-
-
延伸方法
-
Hash#default_proc=
可以傳遞 nil 來清除預設程序。
-
-
-
-
已淘汰的方法
-
IO#lines、bytes、chars 和 codepoints 已淘汰。
-
-
-
-
新增方法
-
新增
Kernel#Hash
轉換方法,例如 Array() 或 Float()。 -
新增
Kernel#__dir__
,它會傳回呼叫此方法的檔案目錄的絕對路徑。 -
新增
Kernel#caller_locations
,它會傳回一個包含框架資訊物件的陣列。
-
-
延伸方法
-
Kernel#warn
接受多個參數,例如 puts。 -
Kernel#caller
接受第二個選用參數「n」,用來指定所需的呼叫者大小。 -
Kernel#to_enum 和 enum_for 接受一個區塊,用於延遲大小評估。
-
-
不相容的變更
-
system() 和 exec() 會關閉非標準檔案描述符(:close_others 選項的預設值已預設變更為 true)。
-
針對受保護方法的 respond_to? 現在會傳回 false,除非第二個參數為 true。
-
__callee__ 已回復到原始行為,現在會傳回呼叫名稱,但不會傳回別名方法中的原始名稱。
-
Kernel#inspect 不再呼叫 to_s(它曾呼叫重新定義的 to_s)。
-
-
-
LoadError
-
新增方法
-
新增
LoadError#path
方法,用來傳回無法載入的檔案名稱。
-
-
-
-
新增方法
-
新增
Module#prepend
,它類似於Module#include
,但是已預先加入的模組中的方法會覆寫預先加入的模組中的對應方法。 -
新增
Module.prepended
和Module.prepend_features
,類似於 included 和 append_features。 -
新增
Module#refine
,它會在本地端延伸類別或模組。[實驗性質]
-
-
延伸方法
-
Module#define_method
接受來自Module
的UnboundMethod
。 -
Module#const_get
接受一個合格常數字串,例如 Object.const_get(“Foo::Bar::Baz”)
-
-
-
Mutex
-
新增方法
-
新增 Mutex#owned?,用於回傳目前執行緒是否持有 mutex。[實驗性質]
-
-
不相容的變更
-
Mutex#lock、Mutex#unlock、Mutex#try_lock、Mutex#synchronize 和 Mutex#sleep 不再允許從 trap 處理常式中使用,並會在這種情況下引發
ThreadError
。 -
Mutex#sleep 可能會發生虛假喚醒。喚醒後請檢查。
-
-
-
-
新增方法
-
新增 nil.to_h,用於回傳 {}
-
-
-
-
新增低階類別,用於持有物件的弱參照。
-
-
-
不向後相容的變更
-
移除
Proc#==
和 eql?,因此只有兩個 proc 是同一個物件時才會相等。
-
-
-
-
新增方法
-
新增 getsid,用於取得工作階段 ID(僅限 Unix)。
-
-
-
-
新增方法
-
新增
Range#size
,用於進行延遲大小評估。 -
新增
Range#bsearch
,用於進行二元搜尋。
-
-
-
RubyVM
(MRI 專用)-
新增
RubyVM::InstructionSequence.of
,用於從方法或區塊取得指令序列。 -
新增
RubyVM::InstructionSequence#path
、absolute_path、label、base_label 和 first_lineno,用於擷取指令序列定義位置的資訊。 -
新增環境變數,用於指定堆疊使用情況
-
RUBY_THREAD_VM_STACK_SIZE:執行緒建立時使用的 VM 堆疊大小。預設值:128KB(32 位元 CPU)或 256KB(64 位元 CPU)。
-
RUBY_THREAD_MACHINE_STACK_SIZE:執行緒建立時使用的機器堆疊大小。預設值:512KB 或 1024KB。
-
RUBY_FIBER_VM_STACK_SIZE:光纖建立時使用的 VM 堆疊大小。預設值:64KB 或 128KB。
-
RUBY_FIBER_MACHINE_STACK_SIZE:光纖建立時使用的機器堆疊大小。預設值:256KB 或 512KB。
這些變數僅在啟動時檢查。
-
-
新增常數 DEFAULT_PARAMS,用於取得上述預設參數。
-
-
-
新增方法
-
新增
Signal.signame
,用於回傳訊號名稱
-
-
不相容的變更
-
Signal.trap
會在指定 :SEGV、:BUS、:ILL、:FPE、:VTALRM 時引發ArgumentError
。
-
-
-
-
新增方法
-
新增
String#b
,用於回傳編碼為 ASCII-8BIT 的複製字串。
-
-
變更回傳值
-
String#lines
現在會回傳陣列,而非列舉器。 -
String#chars
現在會回傳陣列,而非列舉器。 -
String#codepoints
現在會回傳陣列,而非列舉器。 -
String#bytes
現在會回傳陣列,而非列舉器。
-
-
-
-
新增方法
-
新增
Struct#to_h
,用於回傳值,其鍵值對應至實例變數名稱。
-
-
-
-
新增方法
-
新增
Thread#thread_variable_get
用於取得執行緒區域變數(與Fiber
區域變數不同)。 -
新增
Thread#thread_variable_set
用於設定執行緒區域變數。 -
新增
Thread#thread_variables
用於取得執行緒區域變數金鑰清單。 -
新增
Thread#thread_variable?
用於測試特定執行緒變數是否已設定。 -
新增
Thread.handle_interrupt
以及實例和單例方法 pending_interrupt? 用於非同步處理例外狀況 -
新增
Thread#backtrace_locations
,傳回與Kernel#caller_locations
類似的資訊。
-
-
新增類別
Thread::Backtrace::Location
用於保存回溯位置資訊。這些資訊由Thread#backtrace_locations
和Kernel#caller_locations
傳回。 -
不相容的變更
-
Thread#join
和Thread#value
現在會引發ThreadError
,如果目標執行緒是目前或主執行緒。
-
-
-
-
變更回傳值
-
Time#to_s
現在會傳回 US-ASCII 編碼,而不是 BINARY。
-
-
-
-
新增類別。此類別是 set_trace_func 的替代品。易於使用且實作有效率。
-
-
頂層
-
新增方法
-
新增 main.define_method,用於定義全域函式。
-
新增 main.using,用於將改良內容匯入目前檔案或 eval 字串。[實驗性質]
-
-
核心類別相容性問題(不含功能錯誤修正)¶ ↑
-
見上。
-
這些方法不再傳回
Enumerator
,儘管傳遞區塊仍受支援,以維持向後相容性。像 str.lines.with_index(1) { |line, lineno| … } 之類的程式碼不再運作,因為 str.lines 傳回陣列。在這種情況下,請將 lines 替換為 each_line。
-
IO#lines
-
IO#chars
-
IO#codepoints
-
IO#bytes
-
ARGF#lines
-
ARGF#chars
-
ARGF#bytes
-
StringIO#lines
-
StringIO#chars
-
StringIO#codepoints
-
StringIO#bytes
-
Zlib::GzipReader#lines
-
Zlib::GzipReader#bytes
這些方法已棄用,建議改用 each_line、each_byte、each_char 和 each_codepoint。
-
這些方法已移除。只有當兩個程序是同一個物件時,它們才會相等。
-
Fixnum
-
Bignum
-
Fixnum、Bignum 和 Float 已凍結。
-
見上。
-
合併 Onigmo。 github.com/k-takata/Onigmo
-
system() 和 exec() 的 :close_others 選項預設為 true。此外,所有新的檔案描述符預設都會設定 close-on-exec 旗標。這表示檔案描述符不會繼承到衍生的程序,除非明確要求,例如 system(…, fd=>fd)。
-
針對受保護方法的 Kernel#respond_to? 現在會傳回 false,除非第二個參數為 true。
-
Kernel#respond_to_missing?
-
Kernel#initialize_clone
-
Kernel#initialize_dup
這些方法現在已設為私人。
-
見上。
-
Mutex#lock、Mutex#unlock、Mutex#try_lock、Mutex#synchronize 和 Mutex#sleep
見上。
標準函式庫更新(僅列出未完成的)¶ ↑
-
cgi
-
新增 HTML5 標籤產生器。
-
CGI#header
已重新命名為CGI#http_header
,並別名為CGI#header
。 -
當呼叫 HTML5 標籤產生器時,會覆寫
CGI#header
,CGI#header
函式的功能是建立一個 <header> 元素。
-
-
-
移除 CSV::dump 和 CSV::load,以保護使用者免於危險的序列化漏洞
-
-
iconv
-
Iconv 已移除。請改用
String#encode
。
-
-
io/console
-
新增方法
-
新增
IO#cooked
,可在指定的區塊中將終端機設定為熟練模式。 -
新增
IO#cooked!
,可將終端機設定為熟練模式。
-
-
延伸方法
-
-
io/wait
-
新增功能
-
新增
IO#wait_writable
方法。 -
新增
IO#wait_readable
方法作為IO#wait
的別名。
-
-
-
json
-
更新至 1.7.7。
-
-
net/http
-
新增功能
-
現在會自動從 http_proxy 環境變數偵測代理伺服器。有關詳細資訊,請參閱
Net::HTTP::new
。 -
現在預設會為所有要求請求 gzip 和 deflate 壓縮。有關詳細資訊,請參閱
Net::HTTP
。 -
現在會在單一實例的連線間重複使用 SSL 會話。這會使用先前協商的會話來加速連線。
-
可以從
URI
建立要求,這會設定要求的 request_uri 和主機標頭(但不會變更連線的主機)。 -
回應包含所要求的
URI
,這讓追蹤重新導向的實作更為容易。
-
-
新增方法
-
延伸方法
-
如果已指定,
Net::HTTP#connect
會使用 local_host 和 local_port。
-
-
-
net/imap
-
新增方法
-
Net::IMAP.default_port
-
Net::IMAP.default_imap_port
-
Net::IMAP.default_tls_port
-
Net::IMAP.default_ssl_port
-
Net::IMAP.default_imaps_port
-
-
-
objspace
-
openssl
-
嘗試編碼 nil 值時,會持續引發錯誤。現在,當對值為 nil 的實例呼叫 to_der 時,
OpenSSL::ASN1::Primitive
的所有實例都會引發TypeError
。在相同情況下,OpenSSL::ASN1::Constructive
的所有實例都會引發NoMethodError
。仍然允許建構此類值。 -
透過將 OpenSSL::SSL::SSLContext#ssl_version 設定為 :TLSv1_2、:TLSv1_2_server、:TLSv1_2_client 或 :TLSv1_1、:TLSv1_1_server、:TLSv1_1_client 來支援 TLS 1.1 和 1.2。可以透過 OpenSSL::SSL#ssl_version 查詢實際使用的版本。此外,也可以使用 OpenSSL::SSL::OP_NO_TLSv1_1 和 OpenSSL::SSL::OP_NO_TLSv1_2 將新的 TLS 版本加入黑名單。
-
新增
OpenSSL::SSL::SSLContext#renegotiation_cb
。可以設定使用者定義的回呼,每當協商新的握手時就會呼叫此回呼。這也允許以程式化方式拒絕(用戶端)重新協商嘗試。 -
透過 OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS 支援「0/n」分割記錄作為 BEAST 緩解措施。
-
OpenSSL::SSL::SSLContext
的預設選項已變更為 OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS,而不是只有 OpenSSL::SSL::OP_ALL。這會預設啟用 BEAST 攻擊的對策。 -
OpenSSL
要求用於解密 PEM 編碼檔案的密碼長度至少為四個字元。這導致尷尬的情況,即可以匯出密碼長度小於四個字元的檔案,但之後無法存取該檔案。因此,OpenSSL::PKey::RSA
、OpenSSL::PKey::DSA
和OpenSSL::PKey::EC
現在在以密碼匯出私密金鑰至 PEM 時強制執行相同的檢查,其長度必須至少為四個字元。 -
SSL/TLS 支援下一個協定協商擴充功能。支援
OpenSSL
1.0.1 及更新版本。 -
OpenSSL::OPENSSL_FIPS 允許用戶端應用程式偵測
OpenSSL
是否已啟用 FIPS。OpenSSL.fips_mode=
允許手動開啟和關閉 FIPS 模式,以適應 FIPS 模式為明確需求的情況。 -
透過 Cipher#auth_data= 和 Cipher#auth_tag/Cipher#auth_tag= 支援與關聯
Data
的驗證加密 (AEAD)。目前 (OpenSSL
1.0.1c),僅支援 GCM 模式。
-
-
ostruct
-
新增方法
-
延伸方法
-
OpenStruct.new
也接受OpenStruct
/Struct
。
-
-
-
pathname
-
延伸方法
-
Pathname#find
會在未提供區塊時傳回列舉器。
-
-
-
rake
-
rake 已更新至版本 0.9.5。
此版本與之前的 rake 版本向下相容,並包含許多錯誤修正。
請參閱 rake.rubyforge.org/doc/release_notes/rake-0_9_5_rdoc.html 以取得 rake 0.9.3、0.9.4 和 0.9.5 變更清單。
-
-
-
RDoc
已更新至版本 4.0此版本與之前的 rdoc 版本大多數向下相容。最顯著的變更為 ri 資料格式的更新 (ri 資料必須針對跨 rdoc 版本共用的 gem 重新產生)。其他 API 變更為內部變更,不會影響大多數使用者。
顯著變更包括
-
ri 的頁面支援。試試「ri ruby:」取得 ruby 中的頁面清單,或「ri ruby:syntax/literals」取得文字的語法文件。
這也適用於 gem,例如「ri rspec:README」取得 rspec gem 的 README 檔案。
-
Markdown 支援。請參閱 ri
RDoc::Markdown
以取得詳細資料。
請參閱 github.com/rdoc/rdoc/blob/master/History.rdoc 以取得 rdoc 4.0 中變更的完整清單。
-
-
-
resolv
-
新增方法
-
Resolv::DNS::Config#timeouts=
-
-
rexml
-
REXML::Document#write 支援
Hash
參數。 -
REXML::Document#write 支援新的 :encoding 選項。它會變更 XML 文件編碼。若沒有 :encoding 選項,XML 宣告中的編碼會用於 XML 文件編碼。
-
-
RubyGems
-
已更新至 2.0.0
RubyGems 2.0.0 具有下列改進功能
-
改善對 ruby 2.0.0+ 附帶預設 gem 的支援
-
gem 可透過
Gem::Specification#metadata
擁有任意元資料 -
「gem search」現在預設為 –remote,且會像 gem list 一樣錨定。
-
已新增 –document 以取代 –rdoc 和 –ri。使用 –no-document 來停用文件,使用 –document=rdoc 來只產生 rdoc。
-
預設只會產生 ri 格式的文件。
-
「gem server」使用
RDoc::Servlet
從RDoc
4.0 產生 HTML 文件。
如需更新和錯誤修正的擴充清單,請參閱:github.com/rubygems/rubygems/blob/master/History.txt
-
-
-
shellwords
-
Shellwords#shellescape
現在會使用 to_s 將指定的物件字串化。 -
Shellwords#shelljoin
會接受指定陣列中的非字串物件,每個物件都會使用 to_s 字串化。
-
-
stringio
-
已淘汰的方法
-
StringIO#lines、bytes、chars 和 codepoints 已過時。
-
-
-
syslog
-
已新增
Syslog::Logger
,它會在Syslog
上提供Logger
API。 -
Syslog::Priority、
Syslog::Level
、Syslog::Option
和Syslog::Macros
已引入,以便於偵測執行中系統上的可用常數。
-
-
tmpdir
-
不相容的變更
-
Dir.mktmpdir
使用FileUtils.remove_entry
,而不是FileUtils.remove_entry_secure
。這表示應用程式不應變更已建立暫存目錄的權限,以讓其他使用者可以寫入。
-
-
-
yaml
-
Syck 已移除。
YAML
現在完全依賴已安裝的 libyaml。 -
libyaml 現在與 ruby 綑綁在一起,適用於未在本地安裝該函式庫的情況。
-
-
zlib
-
已為
Zlib::Inflate
和Zlib::Deflate
新增串流支援。這允許處理串流,而無需使用大量記憶體。 -
新增支援新的 deflate 策略 Zlib::RLE 和 Zlib::FIXED。
-
Zlib
串流現在在沒有 GVL 的情況下處理。這允許 gzip、zlib 和 deflate 串流平行處理。 -
已淘汰的方法
-
Zlib::GzipReader#lines 和 bytes 已棄用。
-
-
標準函式庫相容性問題(排除功能錯誤修正)¶ ↑
-
OpenStruct
新方法可能會與名為「each_pair」、「eql?」、「hash」或「to_h」的客製屬性衝突。 -
Dir.mktmpdir
在 lib/tmpdir.rb見上。
C API 更新¶ ↑
-
新增 NUM2SHORT() 和 NUM2USHORT()。它們類似於 NUM2INT,但較短。
-
新增 rb_newobj_of() 和 NEWOBJ_OF()。它們會建立指定類別的新物件。