Ruby中字符串sum方法处理长字符串结果不符合预期问题求解
Ruby字符串
sum方法结果异常原因 两个写法调用的是完全不同的sum方法实现,核心差异如下:
- 直接调用的
String#sum是专门为快速计算校验和设计的方法,自带默认可选参数n,默认值为16。该方法返回值为「所有字符ASCII码点总和对2^n - 1取模的结果」,也就是默认会对65535取模。- 短字符串的字符ord总和小于65535时,取模结果等于真实总和,输出符合预期;当处理长字符串时,总和超过65535,取模后的值就会偏离真实总和,导致输出错误。
- 修改后调用的是
Array#sum,该方法没有默认取模逻辑,会直接累加所有元素的数值得到真实总和,不受字符串长度影响,因此结果正确。
如果不想转数组直接使用String#sum得到正确结果,可以显式传入足够大的n值避免取模截断,参考写法:
putc gets.upcase.sum(32)/~/$/
只要保证2^n大于你预期的总和最大值,就能得到和数组sum一致的结果。
内容的提问来源于stack exchange,提问作者Suzuna Minami
相关产品推荐
相关产品推荐

