Ruby如何将单词数组转换为末尾带and的随机排序逗号分隔字符串?
Ruby 数组转指定格式字符串的优化实现方案
需求说明
- 待处理单词数组:
["apple","banana","pineapple","plum","pear"] - 处理规则:先将数组元素随机打乱,除最后一个元素外其余用逗号分隔,最后一个元素前添加斜体格式的
and,最终输出示例:I like plum, pineapple, banana, pear *and* apple.
现有实现代码
%Q{ I like #{%w[apple banana pineapple plum pear].shuffle.yield_self{|q| [q[0..-2].join(", "),q[-1]].join(" and ") }} }
更符合Ruby风格的优化方案
方案1:Rails环境(最简洁健壮)
Rails的Active Support已经原生封装了数组转自然语言列表的方法,直接自定义连接符即可,自动兼容数组长度为1、2、多元素的所有边界场景:
fruits = %w[apple banana pineapple plum pear].shuffle "I like #{fruits.to_sentence(last_word_connector: ' *and* ')}."
方案2:纯Ruby无依赖实现
如果不需要依赖Rails生态,可直接优化原有逻辑,去掉冗余调用,同时兼容边界场景:
arr = %w[apple banana pineapple plum pear].shuffle "I like #{arr.size > 1 ? [arr[0..-2].join(', '), arr[-1]].join(' *and* ') : arr[0]}."
优化后相比原有实现的优势:
- 去掉了冗余的
yield_self调用,逻辑更直观,执行效率更高 - 兼容数组长度为1的特殊场景,原写法在数组只有1个元素时会输出
I like and xxx的错误格式 - 代码可读性更强,符合Ruby社区推崇的简洁可读的编码风格
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

