Замена строки с помощью gsub или sub

Я готовлюсь к завтрашнему экзамену. Один из предыдущих вопросов заключался в определении метода добавления e к элементу массива (массиву символов), если элемент заканчивался на a, или добавлении s, если он заканчивался на i.

Без использования gsub или sub я могу сделать это нормально:

arbitrary = [:alpha, :beta, :kappa, :phi]
p arbitrary

def pluralise (array)
  manipulate = []
  array.each {|member|
    string = member.to_s
    last_char = string[-1,1]
    if last_char == "a" then
      string = string + "e"
      manipulate << string.to_sym
    end
    if last_char == "i" then
      string = string + "s"
      manipulate << string.to_sym
    end

  }
  manipulate

end

new_arbitrary = pluralise(arbitrary)

p new_arbitrary

Однако попытка сделать это с помощью gsub или sub не изменит массив:

arbitrary = [:alpha, :beta, :kappa, :phi]
p arbitrary

def pluralisesub (array)
  manipulate = []
  array.each {|member|
    string = member.to_s    
    last_char = string[-1,1]
    if last_char == "a" then
      string.gsub(string, string + "s")
      manipulate << string.to_sym
    end
    if last_char == "i" then
      string.gsub(string,string + "s")
      manipulate << string.to_sym
    end

  }
  manipulate

end

new_arbitrary = pluralisesub(arbitrary)

p new_arbitrary

У кого-нибудь есть идеи, что здесь происходит не так?

Спасибо


person Tom    schedule 16.12.2013    source источник


Ответы (2)


Измените строку string.gsub(string, string + "s") на string.gsub!(string, string + "s"). Это сработает.

String#gsub работает на копии получателя, где String.gsub! работает на получателе сам.

person Arup Rakshit    schedule 16.12.2013
comment
Отлично - это работает! Примет (необходимо подождать 12 минут в зависимости от переполнения стека) - person Tom; 16.12.2013

Вы можете выполнить весь поиск и замену в массиве в операторе map и case.

[:alpha, :beta, :kappa, :phi].map do |v|
  v = v.to_s
  case v[-1]
  when 'a' then v + 'e'
  when 'i' then v + 's'
  else v
  end
end
person Dan Grahn    schedule 16.12.2013
comment
Спасибо, я думал об использовании map. Однако экзаменационный вопрос специфичен тем, что мы должны использовать each , collect или select :) - person Tom; 16.12.2013
comment
Ну это просто глупо. Вы также должны использовать do/end вместо фигурных скобок. - person Dan Grahn; 16.12.2013
comment
mapэто псевдоним collect. - person steenslag; 16.12.2013