some_string.split(',').map(&:strip).map(&:downcase).reject(&:empty?)
Это создает три промежуточных массива и пересекает все три из них, но я бы не стал беспокоиться об этом, если бы вы на самом деле не смогли доказать с помощью профилирования производительности, что это серьезное узкое место.
В противном случае вам придется сделать что-то вроде
some_string.split(',').inject([]) {|ary, str|
ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}
Sidenote: Я бы, вероятно, написал этот код на C # примерно так:
var someList = new List<string>(
from s in someString.Split(
new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
select s.Trim().ToLower());