【问题标题】:.start_with? method not recognizing substring 'a'。从...开始?方法无法识别子字符串“a”
【发布时间】:2017-07-19 16:22:59
【问题描述】:

我想将一个字符串翻译成猪拉丁语。规则如下:

  1. 有效字词长度为两个或多个字母。
  2. 如果单词以辅音开头('a''e''i''o''u' 以外的字母),则第一个字母会移到单词的末尾。
  3. 然后添加'ay'

我设法想出了方法:

 def translate(word)
      if word.size <= 2
         word
      elsif
          word.size > 2
         !word.start_with?('a', 'e', 'i', 'o', 'u')
          x = word.reverse.chop.reverse
          x.insert(-1, word[0])
          x << "ay"
      else
          word << "ay"
      end
    end

但是,我的测试没有通过某些字符串,

Test Passed: Value == "c"
Test Passed: Value == "pklqfay"
Test Passed: Value == "yykay"
Test Passed: Value == "fqhzcbjay"
Test Passed: Value == "ndnrzzrhgtay"
Test Passed: Value == "dsvjray"
Test Passed: Value == "qnrgdfay"
Test Passed: Value == "npfay"
Test Passed: Value == "ldyuqpewypay"
Test Passed: Value == "arqokudmuxay"
Test Passed: Value == "spvhxay"
Test Passed: Value == "firvmanxay"
Expected: 'aeijezpbay' - Expected: "aeijezpbay", instead got: "eijezpbaay"
Expected: 'etafhuay' - Expected: "etafhuay", instead got: "tafhueay"

这些测试通过:

Test.assert_equals(translate("billy"),"illybay","Expected: 'illybay'")
Test.assert_equals(translate("emily"),"emilyay","Expected: 'emilyay'")

我不知道为什么。

【问题讨论】:

标签: ruby


【解决方案1】:

如果word 的长度大于或等于2 个返回字,如果不是,则执行start_with 步骤,但是您的else 语句何时起作用?

尝试将长度验证修改为小于 2,然后检查单词“start_with”是否为元音,并仅返回单词加 ay,如果不是,则执行第一个字符旋转步骤,然后添加 @987654325 @ 部分,类似于:

def translate(word)
  if word.size < 2
    word
  elsif word.start_with?('a', 'e', 'i', 'o', 'u')
    word << "ay"
  else
    x = word.reverse.chop.reverse
    x.insert(-1, word[0])
    x << "ay"
  end
end

【讨论】:

  • 我现在明白我的方法过于复杂了!我所有的测试也都变绿了,所以谢谢你纠正我塞巴斯蒂安!
  • word.size &lt; 2 中的好消息。
【解决方案2】:

你的代码失败了,因为它并没有真正评估单词是否以常量开头,你只是检查它但没有做任何事情,它只是一个孤立的行:

!word.start_with?('a', 'e', 'i', 'o', 'u')

尝试将该行 inside 包含在 if 条件中,如下所示:

def translate(word)
  if word.size <= 2
    word
  else
    if !word.start_with?('a', 'e', 'i', 'o', 'u')
      x = word.reverse.chop.reverse
      x.insert(-1, word[0])
      x << "ay"
    else
      word << "ay"
    end
  end
end

还要注意我删除了if word.size &gt; 2,因为您已经在检查word.size &lt;= 2,所以没有必要,所以除此之外的任何内容都是&gt; 2

【讨论】:

  • 感谢您的回复和建议。不幸的是,其中一项测试仍然失败。
  • @Benjamints 哪个测试?
  • 预期:'efay' - 预期:“efay”,而不是:“ef”
  • @Benjamints 这很奇怪,它应该输出efayay,请在操作中检查here。并且输出efay 与初始条件不匹配(即_3。然后添加“ay”)。
  • 我知道这很奇怪。我一整天都在使用 repl.it,它在这方面工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2020-12-04
  • 2014-05-13
  • 2013-02-17
  • 2018-05-10
  • 2019-02-18
  • 2015-06-23
相关资源
最近更新 更多