Мутирование массива символов - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу изменить массив символов, добавив e или s в конец символов в зависимости от последней буквы каждого символа.Например, массив:

[:alpha, :beta, :kappa, :phi]

будет изменен на:

[:alphae, :betae, :kappae, :phis]

Я могу сделать это, используя условие if ... else и регулярное выражение с массивом строк, но нес символами.Я пытался преобразовать мои символы в строки, изменить их, а затем преобразовать обратно, но я получаю сообщение об ошибке

s = [:aplha, :beta, :kappa, :phi]

def pluralSym(sym, out = [])
  sym.each do |s|
    s.to_s
    if s.match(/a$/)
      out = s.sub(/a$/, "ae")
    elsif s.match(/i$/)
      out = s.sub(/i$/, "is")
    else
      out = s
    end
    out.to_sym
  end
end

p pluralSym(s)

block in pluralSym': undefined method `sub' for :aplha:Symbol

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018
H = { 'a'=>'e', 'i'=>'s' }

def plural_sym(arr)
  arr.map! { |sym| (sym.to_s + H.fetch(sym[-1], '')).to_sym }
end

arr = [:aplha, :beta, :phi, :rho]        
plural_sym arr
  #=> [:aplhae, :betae, :phis, :rho]
arr
  #=> [:aplhae, :betae, :phis, :rho]

См. Hash # fetch .

Вариант этого следующий.

H = Hash.new { |h,k| '' }.merge('a'=>'e', 'i'=>'s')

def plural_sym(arr)
  arr.map! { |sym| (sym.to_s + H[sym[-1]]).to_sym }
end

arr = [:aplha, :beta, :phi, :rho]
plural_sym arr
  #=> [:aplhae, :betae, :phis, :rho]
arr
  #=> [:aplhae, :betae, :phis, :rho]

См. Hash :: new .

0 голосов
/ 13 декабря 2018

Вы конвертируете символ в строку, но не назначаете его и продолжаете использовать символ.Также используйте map вместо each.Быстрое исправление будет:

s = [:aplha, :beta, :kappa, :phi]

def pluralSym(sym, out = [])
  sym.map! do |s|
    str = s.to_s
    if str.match(/a$/)
      out = str.sub(/a$/, "ae")
    elsif s.match(/i$/)
      out = str.sub(/i$/, "is")
    else
      out = str
    end
    out.to_sym
  end
end
0 голосов
/ 13 декабря 2018

Символы неизменны в ruby, поэтому сначала нужно преобразовать их в строку

s = s.to_s
0 голосов
/ 13 декабря 2018

Вы можете создать метод, который получает символ, если он совпадает с /a$/ или /i$/, интерполировать суффикс и преобразовывать его в символ в каждом случае, в противном случае просто вернуть sym

def plural_sym(sym)
  return "#{sym}ae".to_sym if sym =~ /a$/
  return "#{sym}is".to_sym if sym =~ /i$/

  sym
end

p [:aplha, :beta, :kappa, :phi].map(&method(:plural_sym))
# [:aplhaae, :betaae, :kappaae, :phiis]

(&method(:plural_sym)) - это просто способ вызова вашей функции, передавая в качестве аргумента каждый элемент в блоке.

Обратите внимание, что вы не изменяете массив, вы возвращаете новый.

...