首页 > 解决方案 > "b" 的未定义方法 `shift':String (NoMethodError) Ruby

问题描述

尝试运行此将字符串转换为猪拉丁语的方法时,我不断收到相同的错误。

def pig_latin_word(word)
  new_arr = []
  letter = word.split("")

    if letter[0] == "a" || letter[0] == "e" || letter[0] == "i" || letter[0] == "o" || 
      letter[0] == "u"
      new_arr << "yay"
    else
      letter[0].shift && new_arr << letter[0].push + "ay"
    end
  return new_arr.join
end

# Test cases: 
puts pig_latin_word("eat")     # => "eatyay"
puts pig_latin_word("banana")  # => "ananabay"
puts pig_latin_word("trash")   # => "ashtray"

标签: rubyruby-on-rails-3

解决方案


从我看到的情况来看,您正在尝试转换为字母(字符串)。基本上,每当您执行 letter[0].shift 时,您都会取消引用数组的第一个元素,该元素是一个字符串。Shift 适用于数组。

这是一个代码片段,可以很好地完成您尝试做的事情。根据您发布的代码,只有最后一个测试用例无法返回您建议的值。您说它应该返回“ashtray”,但是如果您移开第一个字母,请将其附加到最后一个字母并添加 ay,您实际上应该得到“rashtay”

def pig_latin_word(word)
  return "#{word}yay" if word =~ /^[AEIOUaeiou]/
  word_array = word.split('')
  latin_word = "#{word_array[0..word_array.length].join}#{word_array.shift}ay"

  return latin_word
end

puts pig_latin_word("eat")     # => "eatyay"
puts pig_latin_word("banana")  # => "ananabay"
puts pig_latin_word("trash")   # => "rashtay"

推荐阅读