【问题标题】:Mutating an array of symbols改变符号数组
【发布时间】:2019-05-14 15:41:01
【问题描述】:

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

【问题讨论】:

  • 我想知道如何在 Ruby 中改变符号数组。下面已经回答了这个问题。我的作业有问题。

标签: ruby symbols dplyr


【解决方案1】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这不会改变数组。
    • 我已将其更改为破坏性操作它现在发生了变异
    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

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

      s = s.to_s
      

      【讨论】:

      • Object#to_s 不会改变对象,即使它是可变的。这种措辞毫无意义。
      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2018-01-31
      相关资源
      最近更新 更多