突变符号数组

时间:2018-12-13 12:11:23

标签: ruby symbols mutate

我想通过根据每个符号的最后一个字母在符号的末尾添加es来对符号数组进行突变。例如,数组:

[: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 :(得分:3)

您可以创建一种接收符号的方法,如果该符号与/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))只是一种调用函数的方法,该函数以参数形式传递块中的每个元素。

请注意,您不是在更改数组,而是要返回一个新数组。

答案 1 :(得分:2)

您将符号转换为字符串,但未分配它,而是继续使用符号。同时使用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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

符号在ruby中是不可变的,因此您需要先将其转换为字符串

https://appdividend.com/2018/09/06/laravel-5-7-crud-example-tutorial/

https://laracasts.com/series/laravel-from-scratch-2018