此 EEP 描述了兩個新的 guard BIF tuple_size/1
和 byte_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 + 1
或 bit_size(B) div 8 + 1
都是錯誤的,而正確的表達式 (bit_size(B)+7) div 8
並不是那麼容易看出來的。
實作很簡單。
需要變更包含名為 tuple_size/1
或 byte_size/1
的本機函式的程式碼。
編譯器將發出警告,指出 size/1
已過時,並且在 R14B 中將移除使用 size/1
的程式碼。