作者
Björn Gustavsson <bjorn(at)erlang(dot)org>
狀態
最終/R12B-0 提案已在 OTP R12B-0 版本中實作
類型
標準追蹤
建立時間
2007-08-10
Erlang 版本
OTP_R12B-0

EEP 6:用於元組和二元組大小的新 BIF #

摘要 #

此 EEP 描述了兩個新的 guard BIF tuple_size/1byte_size/1,作為 size/1 BIF 的首選替代方案。

規範 #

byte_size/1::bitstring() -> integer()

返回儲存整個位元字串所需的位元組數(請參閱 EEP 4)。此 BIF 將返回與 (bit_size(Bin)+7) div 8 相同的值(也就是說,如果位數不能被 8 整除,位元組數將會向上取整)。 此 BIF 允許在 guard 中使用。

tuple_size/1::tuple() -> integer()

返回元組的大小。如果傳入的不是元組,此 BIF 將失敗。此 BIF 允許在 guard 中使用。

理由 #

size/1 BIF 接受二元組或元組,並返回二元組的大小(以位元組為單位)或元組的大小。

因為 size/1 接受兩種不同的類型,所以在編譯器和執行時期系統中都很難優化它的使用。增加兩個新的 BIF 將有助於優化,並將幫助 Dialyzer。

有人可能會認為 byte_size/1 應該只適用於二元組(位數大小可以被 8 整除的位元字串),以便捕獲程式碼無法處理一般位元字串且仍然不使用 is_binary/1 guard 測試的錯誤。我認為,如果程式設計師必須將 bit_size/1 的結果向上取整為整數位元組,他或她更有可能犯這個錯誤: “顯而易見”的表達式 bit_size(B) / 8 + 1bit_size(B) div 8 + 1 都是錯誤的,而正確的表達式 (bit_size(B)+7) div 8 並不是那麼容易看出來的。

實作 #

實作很簡單。

向後相容性 #

需要變更包含名為 tuple_size/1byte_size/1 的本機函式的程式碼。

編譯器將發出警告,指出 size/1 已過時,並且在 R14B 中將移除使用 size/1 的程式碼。