首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“b”的未定义方法“`shift”:String (NoMethodError) Ruby

“b”的未定义方法“`shift”:String (NoMethodError) Ruby
EN

Stack Overflow用户
提问于 2020-05-21 05:15:48
回答 2查看 562关注 0票数 0

当我试图运行这个将字符串转换成拉丁语的方法时,我仍然会遇到同样的错误。

代码语言:javascript
复制
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
代码语言:javascript
复制
# Test cases: 
puts pig_latin_word("eat")     # => "eatyay"
puts pig_latin_word("banana")  # => "ananabay"
puts pig_latin_word("trash")   # => "ashtray"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-21 06:53:29

#shift#push都是数组方法,您在letter[0]上调用它们,这是一个字符串。即使您将其修复为使用letter.shiftletter.push,也不会得到“垃圾”、“=>”烟灰缸,除非您从单词的开头循环并收集常量。

代码语言:javascript
复制
def pig_latin_word(word)
  exp = /^[AEIOUaeiou]/
  if word =~ exp
    word + "yay"
  else
    word.each_char
        .take_while {|c| c !~ exp }
        .yield_self do |consonants|
          word[consonants.length..-1] + consonants.join + "ay"
        end
  end
end
代码语言:javascript
复制
require 'minitest/autorun'
class PigLatinTest < Minitest::Test
  def test_word_that_begins_with_a_vowel
    assert_equal("eatyay", pig_latin_word("eat"))
  end
  def test_word_that_begins_with_a_consonant
    assert_equal("ananabay", pig_latin_word("banana"))
  end
  def test_word_that_begins_with_multiple_consonants
    assert_equal("ashtray", pig_latin_word("trash"))
  end
end
代码语言:javascript
复制
maxcal@pop-os ~/p/sandbox> ruby test.rb
Run options: --seed 59131

# Running:

...

Finished in 0.001205s, 2488.6889 runs/s, 2488.6889 assertions/s.
3 runs, 3 assertions, 0 failures, 0 errors, 0 skips

请参见:

票数 1
EN

Stack Overflow用户

发布于 2020-05-21 06:29:57

据我所见,你正在尝试转换成字母(字符串)。实际上,无论何时执行letter.shift,都是取消引用数组的第一个元素,即字符串。Shift适用于数组。

下面是一个代码片段,它巧妙地完成了您想要做的事情。只有最后一个测试用例不能返回您所发布的代码所建议的值。你说它应该返回“烟灰缸”,但是如果你移开第一个字母,把它附加到最后一个字母,然后加上“y”,你实际上应该得到"rashtay“。

代码语言:javascript
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61927746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档