Ruby中divmod方法调用结果与预期不符的原因咨询
问题分析与解决
错误原因
方法绑定方向完全搞反
4.method(:divmod)生成的是绑定在整数4上的divmod方法对象,通过&转为Proc传入map后,map会把数组a的每个元素作为参数传给这个方法,实际执行的是4.divmod(元素),而非你预期的元素.divmod(4)——这就是结果里商和余数顺序颠倒的核心原因。数组追加方式错误
b << a.map(...)会把map返回的整个数组作为单个元素塞进b,导致最终b是嵌套数组[[...]],而非直接包含所有divmod结果的数组。
正确实现(满足&语法要求)
要实现元素.divmod(4)的逻辑,同时符合&语法要求,推荐简洁的lambda转Proc方式:
a = [7, 1, 65, 4, 13, 97] b = [] # 用lambda转成Proc,满足&语法要求 b.concat(a.map(&->(num) { num.divmod(4) }))
如果不需要保留初始空数组b,直接赋值更简单:
b = a.map(&->(num) { num.divmod(4) })
执行后b会得到预期结果:
[[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]
补充说明
如果坚持用方法对象思路,也可以通过反转参数绑定实现,但可读性较差:
b = a.map(&Integer.instance_method(:divmod).curry[4].to_proc.reverse)
实际开发中优先选择lambda的实现方式更清晰。
内容的提问来源于stack exchange,提问作者jbk
相关产品推荐
相关产品推荐

