此 EEP 描述了两个新的保护 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 允许在保护中使用。
tuple_size/1::tuple() -> integer()
返回元组的大小。如果传递的任何内容不是元组,则此 BIF 将失败。此 BIF 允许在保护中使用。
size/1
BIF 接受二进制或元组,并返回二进制的字节大小或元组的大小。
由于 size/1
接受两种不同的类型,因此在编译器和运行时系统中难以优化它的使用。添加这两个新的 BIF 将有助于优化,并且还将帮助 Dialyzer。
可以认为 byte_size/1
应该只适用于二进制文件(位大小可以被 8 整除的位串),以捕获代码无法处理一般位串并且仍然不使用 is_binary/1
保护测试的错误。在我看来,如果程序员必须将 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
的代码。