我想通过根据每个符号的最后一个字母在符号的末尾添加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
答案 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