Ruby中delete_if方法的工作原理及特定代码执行结果疑问
嘿,我来帮你把这两个Ruby问题讲明白~
1. Ruby中delete_if方法的工作原理
delete_if是Ruby数组的内置迭代方法,核心逻辑直白易懂:
- 它会遍历数组中的每一个元素,把每个元素传入你定义的块(也就是
{ ... }里的代码); - 块会返回一个布尔值(true/false),如果返回
true,对应的元素就会被从数组里删除; - 注意,它是直接修改原数组的原地操作,同时也会返回修改后的数组本身。
举个简单例子帮你理解:
nums = [1, 2, 3, 4, 5] nums.delete_if { |num| num.odd? } # 删除所有奇数元素 p nums # 输出 => [2, 4]
2. 为什么数组中的'a'被delete_if删除了?
咱们逐行拆解你的代码逻辑:
x = [1, 2, 3, 'a', 9.5] x.delete_if{ |elem| elem.to_i <= 3} p x # 输出 => [9.5]
问题出在to_i方法对不同类型元素的处理规则上:
- 对于数字(整数/浮点数):
to_i会把它们转换成整数,比如9.5.to_i得到9,3.to_i还是3; - 对于字符串:如果字符串开头不是有效数字,
to_i会直接返回0。你的字符串是'a',所以'a'.to_i的结果是0,而0显然满足<=3的条件,因此'a'被判定为需要删除的元素。
咱们逐个核对数组元素的判定结果:
- 1.to_i → 1 ≤3 → 被删除
- 2.to_i →2 ≤3 → 被删除
- 3.to_i →3 ≤3 → 被删除
- 'a'.to_i →0 ≤3 → 被删除
- 9.5.to_i →9 >3 → 保留
所以最后数组里就只剩下9.5啦。
内容的提问来源于stack exchange,提问作者danxo
相关产品推荐
相关产品推荐

