NEWS for Ruby 2.3.0¶ ↑
本文件列出各版本之間使用者可見的功能變更,不含錯誤修正。
請注意,每則項目都簡短說明,不提供背後原因或參考資訊。如需所有充足資訊的完整變更清單,請參閱 ChangeLog 檔案或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
2.2.0 版本後變更¶ ↑
語言變更¶ ↑
-
frozen-string-literal pragma
-
新的 pragma,frozen-string-literal 已實驗性導入。 [功能 #8976]
-
此外,也已導入 –enable/–disable=frozen-string-literal 選項。 [功能 #8976]
-
命令列選項 –debug 或 –debug=frozen-string-literal 啟用額外的偵錯模式,會在凍結物件錯誤中顯示建立的位置 (
RuntimeError
)。 [功能 #11725]
-
-
安全導覽運算子
-
新的方法呼叫語法,‘object&.foo’,如果 ‘object’ 不是 nil,則會呼叫方法 foo。 [功能 #11537]
這類似於 Active Support 中的 ‘try!’,但
-
方法名稱在語法上是必需的
obj.try! {} # valid obj&. {} # syntax error
-
只有在呼叫時才會評估參數
obj.try!(:foo, bar()) # bar() is always evaluated obj&.foo(bar()) # bar() is conditionally evaluated
-
屬性指定是有效的
obj&.attr += 1
-
-
-
did_you_mean gem
-
當
NameError
或NoMethodError
發生是因為名稱中的錯字時,did_you_mean gem 會自動建議其他類似於方法名稱的名稱。"Yuki".starts_with?("Y") # => NoMethodError: undefined method `starts_with?' for "Yuki":String # Did you mean? start_with?
-
-
縮排的 here 文件
-
新的字串文字,here 文件以 ‘<<~` 開頭。有關更多詳細資訊,請參閱 doc/syntax/literals.rdoc。 [功能 #9098]
-
核心類別更新(僅限傑出的更新)¶ ↑
-
-
ARGF.read_nonblock
支援 ‘exception: false’,例如IO#read_nonblock
。 [功能 #11358]
-
-
-
Array#bsearch_index
[功能 #10730] -
Array#dig
[功能 #11643]
-
-
-
Comparable#==
不再救援例外 [功能 #7688]
-
-
-
新的 Encoding::IBM037(別名 ebcdic-cp-us;虛擬的)
-
-
-
Enumerable#grep_v
已新增為Enumerable#grep
的反向版本。 [功能 #11049] -
Enumerable#chunk_while
[功能 #10769]
-
-
-
Enumerator::Lazy#grep_v
[功能 #11773]
-
-
-
File.mkfifo
[功能 #11536] -
新增對應於 O_TMPFILE 的 File::TMPFILE
-
-
-
Hash#fetch_values
[功能 #10017] -
Hash#dig
[功能 #11643] -
Hash#to_proc
[功能 #11653]
-
-
-
新增模式標記 File::SHARE_DELETE。此標記表示允許刪除 Windows 上已開啟的檔案,但目前僅影響以二進位方式開啟的檔案。[功能 #11218]
-
新增新的選項參數「flags」。此參數會以 bitwise-OR 運算套用至由一般模式引數產生的 oflags。[功能 #11253]
-
IO#advise
不再會在編譯時偵測到但執行時無法使用的情況下引發 Errno::ENOSYS。[功能 #11806]
-
-
-
Kernel#loop
在因StopIteration
例外而停止時,會傳回列舉器傳回的內容,而不是 nil。[功能 #11498]
-
-
-
Module#deprecate_constant
[功能 #11398]
-
-
-
NameError#receiver
已新增,用於接收接收器物件。[功能 #10881]
-
-
-
Numeric#positive?
和Numeric#negative?
已新增,當接收器分別為正數和負數時,會傳回 true。[功能 #11151]
-
-
-
Proc#call
(以及 []、===、yield)已最佳化。後續追蹤不會顯示每個方法(直接顯示區塊行)。TracePoint
也會忽略這些呼叫。[功能 #11569]
-
-
佇列 (
Thread::Queue
)-
已新增 Queue#close,用於通知終止。[功能 #10600]
-
-
正規表示式/字串:已將 Unicode 版本從 7.0.0 更新為 8.0.0
-
-
新增以下方法,作為 iseq 載入器的基本工具。請參閱 sample/iseq_loader.rb 以了解用法。請注意,載入器沒有驗證器,因此載入已修改/已損毀的二進位資料很容易造成嚴重問題。請參閱 [功能 #11788] 以取得更多詳細資訊。(實驗性功能)
-
-
-
String.new
現在接受新的選項參數「encoding」。[功能 #11785]
-
-
Struct#dig
[功能 #11688]
-
-
-
Thread#name
、Thread#name=
已新增,用於處理執行緒名稱 [功能 #11251]
-
核心類別相容性問題(不包含功能錯誤修正)¶ ↑
-
-
Array#select!
、Array#keep_if
、Array#reject!
和Array#delete_if
不再會在每次呼叫區塊時立即變更接收器陣列。[功能 #10714] -
Array#flatten
和Array#flatten!
不再嘗試呼叫超過指定層級的元素的 to_ary 方法。[錯誤 #10748] -
Array#inspect
即使其內容傳回的字串與Encoding.default_external
不相容,也不會引發錯誤,因為這是檢查結果。[功能 #11801]
-
-
-
Enumerable#chunk
和Enumerable#slice_before
不再採用 initial_state 參數。[功能 #10958] 請改用局部變數來維護狀態。
-
-
-
在 Windows 上,
File::Stat#ino
以前總是傳回 0,但現在會傳回 BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low。[功能 #11216]
-
-
-
Hash#inspect
即使其內容傳回的字串與Encoding.default_external
不相容,也不會引發錯誤,因為這是檢查結果。[功能 #11801]
-
-
-
IO#each_codepoint
會在轉換發生時,在 EOF 之前的未完成字元引發例外。[錯誤 #11444]
-
-
Module#define_method
和Object.define_singleton_method
現在需要方法主體、Proc
、Method
或區塊,如果沒有直接提供區塊,則會引發ArgumentError
。[錯誤 #11283]
-
-
封裝/解封裝(陣列/字串)
-
j 和 J 指令用於指標寬度整數類型。[功能 #11215]
-
Stdlib 更新(僅限未完成的更新)¶ ↑
-
-
Logger#level=
現在支援符號和字串層級,例如::debug、:info、:warn、:error、:fatal(不分大小寫)[功能 #11695] -
Logger#reopen
已新增,用於重新開啟日誌裝置。[功能 #11696]
-
-
io/wait
-
IO#wait_readable
不再檢查 FIONREAD,它可用於非位元組串流IO
,例如監聽 socket。
-
-
Net::FTP
-
已新增 Net::FTP#mlst。
-
已新增 Net::FTP#mlsd。
-
-
nkf
-
合併 nkf 2.1.4。
-
-
ObjectSpace
(objspace) -
-
OpenSSL::SSL::SSLSocket#accept_nonblock
和OpenSSL::SSL::SSLSocket#connect_nonblock
支援『exception: false』。[功能 #10532]
-
-
-
Pathname#descend
和Pathname#ascend
支援無區塊形式。[功能 #11052]
-
-
-
Socket#connect_nonblock
、Socket#accept_nonblock
、TCPServer#accept_nonblock
、UNIXServer#accept_nonblock
、BasicSocket#recv_nonblock
、BasicSocket#recvmsg_nonblock
、BasicSocket#sendmsg_nonblock
全部支援『exception: false』,以傳回 :wait_readable 或 :wait_writable 符號,而不是引發IO::WaitReadable
或IO::WaitWritable
例外狀況 [功能 #10532] [功能 #11229] -
BasicSocket#recv
和BasicSocket#recv_nonblock
允許傳出String
緩衝區引數,例如IO#read
和IO#read_nonblock
,以減少GC
負擔 [功能 #11242]
-
-
-
在唯讀模式中,
StringIO#set_encoding
不再設定其緩衝區字串的編碼。現在,不使用StringIO#set_encoding
直接設定字串的編碼可能會導致不可預測的行為。[錯誤 #11827]
-
-
timeout
-
呼叫 Object#timeout 時,現在會警告已過時。
-
Stdlib 相容性問題(不包括功能錯誤修正)¶ ↑
-
ext/coverage/coverage.c
-
Coverage.peek_result
:允許擷取程式碼覆蓋率而不用停止覆蓋率工具的新方法。[功能 #10816]
-
-
-
Fiddle::Function#call
釋放 GVL。[功能 #11607]
-
-
io-console
-
更新至 io-console 0.4.5,並將授權變更為 BSD 2 條款「簡化」授權。
-
-
lib/base64.rb
-
Base64.urlsafe_encode64
:新增「padding」選項,用以抑制填充字元(「=」)。[功能 #10740] -
Base64.urlsafe_decode64
:現在它不只接受填充正確的輸入,也接受未填充的輸入。[功能 #10740]
-
-
lib/drb/drb.rb
-
移除未使用的參數。 github.com/ruby/ruby/pull/515
-
-
lib/matrix.rb
-
新增 Vector#round。 github.com/ruby/ruby/pull/802
-
-
lib/webrick/utils.rb
-
移除未使用的參數。 github.com/ruby/ruby/pull/356
-
-
Net::FTP
-
連線現在預設為被動模式。預設模式可以透過 Net::FTP.default_passive= 變更。[功能 #11612]
-
-
-
Net::HTTP#open_timeout
的預設值現在為 60(原本為 nil)。
-
-
Net::Telnet
-
Net::Telnet 已抽取至 net-telnet gem。它是無法維護的程式碼。[功能 #11083]
-
-
-
更新至
Psych
2.0.17
-
-
Rake
-
Rake 已從 stdlib 中移除。[功能 #11025]
-
-
-
更新至
RDoc
4.2.1。完整的發行說明請參閱github.com/rdoc/rdoc/blob/master/History.rdoc#421–2015-12-22
-
-
RubyGems
內建全域變數相容性問題¶ ↑
-
$SAFE
-
$SAFE=2 和 $SAFE=3 已過時。如果 $SAFE 設為 2 或更大,會引發
ArgumentError
。[功能 #5455]
-
C API 更新¶ ↑
-
rb_define_class_id_under() 現在會在類別已定義,但其超類別與給定的超類別不符時,引發
TypeError
例外,以及 Ruby 層級的定義。 -
新增 rb_timespec_now() 以取得目前日期時間,作為結構體 timespec。[功能 #11558]
-
新增 rb_time_timespec_new() 以建立時間物件,並帶有紀元、奈秒、以及 UTC/當地時間/時間偏移量引數。[功能 #11558]
-
rb_autoload() 已過時,請改用 rb_funcall()。[功能 #11664]
-
rb_compile_error_with_enc()、rb_compile_error() 和 rb_compile_bug() 已過時。這些函式已公開,但僅供內部使用。外部函式庫不應使用它們。
支援的平台變更¶ ↑
-
不再支援 OS/2
-
不再支援 BeOS
-
不再支援 Borland-C
-
Haiku 現在穩定且盡力而為
實作改善¶ ↑
-
最佳化
Proc#call
以消除方法框架建構。[功能 #11569] -
重新考量方法輸入資料結構。[錯誤 #11278]
-
為方法表格等使用的 ID 鍵表格,引入新的表格資料結構。新的表格結構比 st_table 簡單且快速。[功能 #11420]
-
物件配置和方法呼叫碼的機器碼層級調整。r52099、r52254
-
RubyVM::InstructionSequence
已擴充,以利於未來的改善。[功能 #11788] -
案例分派現在針對所有特殊常數文字進行最佳化,包括 nil、true 和 false。先前,只有文字字串、符號、整數和浮點數編譯為最佳化的案例分派。[功能 #11769]
-
非純 Ruby 類別(T_DATA、T_FILE 等)上的實例變數儲存成本比以前更低。[功能 #11170]
-
對大型
Struct
物件的成員的所有存取都以常數時間執行。先前,Struct
元素超過前 10 個元素會使用線性掃描。[功能 #10585] -
Set
類別獲得了幾項速度提升。[雜項 #10754]、[r52591] -
Socket
和 I/O 相關的改善-
在
- 功能 #11229
-
中,大多數使用關鍵字的新 I/O 方法的呼叫開銷已透過避免使用非效率的 C API
來解析關鍵字而降低。[功能 #11339]
-
標準函式庫已更新為使用 [功能 #11229] 中改良的無例外非封鎖 I/O。除了減少昂貴的例外狀況之外,這還具有使 $DEBUG 輸出更簡潔的額外好處。[功能 #11044]
-
(僅限 Linux)在 stdlib 中的任何位置等待單一 FD 不再使用 select(2),使其不受高編號 FD 導致的延遲影響。[功能 #11081] [功能 #11377]
-
-
CGI.escapeHTML
已使用 C 擴充套件進行最佳化。 github.com/ruby/ruby/pull/1164