Ruby中reject!返回nil却删除数组元素?哈希移除LogItem遇困惑
关于Ruby中
reject!返回值的误区及解决方案 哈哈,我刚接触Ruby的时候也踩过这个坑!你对reject!的返回值理解完全错啦,咱们一步步理清楚:
首先明确Array#reject!的实际行为:
- 它会直接修改原数组,移除所有符合块条件的元素
- 返回值规则:
- 如果确实有元素被移除(数组发生了变化),返回修改后的原数组(不是被移除的元素!)
- 如果没有任何元素符合条件(数组没变化),返回
nil
你代码里的情况是:@log[date]原本只有一个LogItem对象,reject!把它删掉后,原数组变成了空数组[],所以array变量其实是这个空数组。你看到array[0].nil?为true,是因为空数组的第一个元素不存在,并不是array本身是nil~
那如果你的需求是返回被移除的对象,应该怎么写呢?这里给你两种常用方案:
方案1:移除单个匹配元素(返回单个对象)
如果你的场景中每个日期下的name是唯一的,用这个方法最直接:
def remove_logItem(name, date) log_items = @log[date] # 先找到要移除的元素 removed_item = log_items.find { |logItem| logItem.name == name } # 从数组中删除该元素(如果找到了的话) log_items.delete(removed_item) if removed_item # 返回被移除的对象,没找到就返回nil removed_item end
方案2:移除所有匹配元素(返回对象数组)
如果同一个日期下可能有多个同名的LogItem,需要全部移除并返回它们:
def remove_logItem(name, date) log_items = @log[date] # 先收集所有要移除的元素 removed_items = log_items.select { |logItem| logItem.name == name } # 从原数组中移除这些元素 log_items.reject! { |logItem| logItem.name == name } # 返回所有被移除的对象数组,没找到就返回空数组 removed_items end
这样就能精准拿到你想要的被移除对象啦~
内容的提问来源于stack exchange,提问作者Donggeon Im
相关产品推荐
相关产品推荐

