Потому что x - это локальная переменная, которая указывает на строку, использующую те же данные. Вот почему влияние на новое значение не изменяется внутри строки.
Вы можете немного переосмыслить свою стратегию здесь; это зависит от того факта, что разделенная строка относится к той же области памяти, что и исходная строка, что, я бы даже не сказал, справедливо во всех случаях.
Я бы предложил вместо этого использовать .map:
name_split = name.split(/\s/).map do |x|
if x =~ /-/
name1, name2 = x.split(/-/)
name1.capitalize + "-" + name2.capitalize
else
x.capitalize
end
end
puts name_split.join(" ")
Или, если вы найдете это более читабельным:
name_split = name.split(/\s/).map do |x|
x.split(/-/).map(&:capitalize).join('-')
end
puts name_split.join(" ")