Ruby数组剔除元素并打印日志:能否简化为单行逻辑?
问题解答
你的思路方向是对的,但当前的单行尝试存在一个潜在问题:&&表达式的结果由最后一个执行的表达式决定。如果custom_logger方法返回nil或false(比如日志方法本身没有显式返回真值),整个表达式的结果就是非真值,会导致本该被剔除的空名字用户无法被reject!处理,和原代码行为不一致。
原代码的核心逻辑是:只要用户名字为空,无论日志方法返回什么,都返回true触发剔除操作。要保持这个逻辑并简化为单行,你可以用分号分隔语句,确保最终返回true:
users.reject! { |user| user[:name].blank? && (custom_logger('user with blank name is not accepted'); true) }
或者利用Ruby的语句执行顺序,用更简洁的写法(不过&&在Ruby中优先级高于and,日常开发里&&更常用):
users.reject! { |user| user[:name].blank? && custom_logger('user with blank name is not accepted') && true }
如果是在Rails环境中,blank?和present?都是ActiveSupport提供的方法,上述写法完全兼容。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

