如何在Ruby中的方法中实现for循环

如何在Ruby中的方法中实现for循环,ruby,Ruby,我的任务是创建一个pig\u-latin方法 猪拉丁语是一种虚构的儿童语言,旨在 令人困惑它遵守一些简单的规则(如下),但是当它被说出来的时候 很快,这对非儿童(和非本地人)来说真的很难 发言人)理解 规则1:如果一个单词以元音开头,则在其后面加上“ay”音 这个词的结尾 规则2:如果一个单词以辅音开头,把它移到结尾 然后在单词的末尾加上一个“是”音 (还有一些关于边缘情况的规则,还有一些区域性的规则 也有变体,但这应该足以理解测试。) 我所有的考试都通过了,除了一个,翻译了很多单词 这是我的错

我的任务是创建一个
pig\u-latin
方法

猪拉丁语是一种虚构的儿童语言,旨在 令人困惑它遵守一些简单的规则(如下),但是当它被说出来的时候 很快,这对非儿童(和非本地人)来说真的很难 发言人)理解

规则1:如果一个单词以元音开头,则在其后面加上“ay”音 这个词的结尾

规则2:如果一个单词以辅音开头,把它移到结尾 然后在单词的末尾加上一个“是”音

(还有一些关于边缘情况的规则,还有一些区域性的规则 也有变体,但这应该足以理解测试。)

我所有的考试都通过了,除了一个,翻译了很多单词

这是我的错误:

#translate
  translates a word beginning with a vowel
  translates a word beginning with a consonant
  translates a word beginning with two consonants
  translates two words
  translates a word beginning with three consonants
  counts 'sch' as a single phoneme
  counts 'qu' as a single phoneme
  counts 'qu' as a consonant even when it's preceded by a consonant
  translates many words (FAILED - 1)

Failures:

  1) #translate translates many words
     Failure/Error: expect(s).to eq("ethay ickquay ownbray oxfay")

       expected: "ethay ickquay ownbray oxfay"
            got: "ethay"

       (compared using ==)
     # ./spec/04_pig_latin_spec.rb:70:in `block (2 levels) in <top (required)>'

Finished in 0.00236 seconds (files took 0.10848 seconds to load)
9 examples, 1 failure

Failed examples:

rspec ./spec/04_pig_latin_spec.rb:68 # #translate translates many words
我想这会涉及到很多词:

def translates_many_words(str)
      str = str.split(' ');
      if str.length > 2
        str.each do |item| 
          return begins_with_consonant(item) || word_begins_with_vowel(item)
        end
      end
  end

但事实并非如此。

正如@theTinMan所说,
return
-将拒绝下一次迭代,只在第一次迭代中返回第一个值,从我的评论来看,我认为这应该对您有效(对代码的编辑最少):

UPD 此外,我还建议您重构代码,使其更具可读性,这将在将来对您有所帮助。 这种方法的变体是:

def translates_many_words(str)
  str = str.split

  # line under - is a shortcut from `return nil if str.size <= 2`
  # `#size` is more relative to this context if you will count elements of array 
  return unless str.size > 2 

  # Now, when we excluded possibility of work with array that have less then 2 elements, 
  # we can continue with our iteration
  str.map do |item| 
    begins_with_consonant(item) || word_begins_with_vowel(item)
  end.join(' ')
end
def翻译多个单词(str)
str=str.split
#-下的行是'return nil if str.size 2'的快捷方式
#现在,当我们排除使用少于2个元素的数组的可能性时,
#我们可以继续我们的迭代
str.map do|item|
_以_辅音(项)开头| |单词_以_元音(项)开头
结束。连接(“”)
结束

正如@theTinMan所说,
return
-将拒绝下一次迭代,并在第一次迭代中只返回第一个值,从我的评论来看,我认为这应该适合您(对代码的编辑最少):

UPD 此外,我还建议您重构代码,使其更具可读性,这将在将来对您有所帮助。 这种方法的变体是:

def translates_many_words(str)
  str = str.split

  # line under - is a shortcut from `return nil if str.size <= 2`
  # `#size` is more relative to this context if you will count elements of array 
  return unless str.size > 2 

  # Now, when we excluded possibility of work with array that have less then 2 elements, 
  # we can continue with our iteration
  str.map do |item| 
    begins_with_consonant(item) || word_begins_with_vowel(item)
  end.join(' ')
end
def翻译多个单词(str)
str=str.split
#-下的行是'return nil if str.size 2'的快捷方式
#现在,当我们排除使用少于2个元素的数组的可能性时,
#我们可以继续我们的迭代
str.map do|item|
_以_辅音(项)开头| |单词_以_元音(项)开头
结束。连接(“”)
结束

str.each。。。return
将在第一次迭代中返回第一个值,因此迭代不会执行您想要的操作。将所有方法嵌入包装方法中不是惯用做法。首先,要使测试通过-
str.map{item}以辅音(item)| |单词以元音(item)开头。加入(“”)
@AlexGolubenko谢谢,朋友!请在上下文中添加您的解决方案或显示您的意思?谢谢你@AntonioPavicevac Ortiz我建议你检查我的答案的UPD
str。。。return
将在第一次迭代中返回第一个值,因此迭代不会执行您想要的操作。将所有方法嵌入包装方法中不是惯用做法。首先,要使测试通过-
str.map{item}以辅音(item)| |单词以元音(item)开头。加入(“”)
@AlexGolubenko谢谢,朋友!请在上下文中添加您的解决方案或显示您的意思?谢谢你@AntonioPavicevac Ortiz我建议您检查我的答案
在行尾不是必需的,也不是惯用的<代码>拆分(“”)
可以写成
split
,因为它的默认行为是在空白处拆分。@theTinMan在你的右边,但是,正如我所说:“在UPD中,你可以看到我的变体”),而不是使用“UPD”或“update”或“edit”,只要在最初包含它的地方添加信息即可。因此,保持对所有问题和答案的修订控制,这样我们就可以看到更改的内容以及需要更改的时间。清晰易读比每周记笔记和更改更重要。
在行尾不是必需的,也不是惯用的<代码>拆分(“”)
可以写成
split
,因为它的默认行为是在空白处拆分。@theTinMan在你的右边,但是,正如我所说:“在UPD中,你可以看到我的变体”),而不是使用“UPD”或“update”或“edit”,只要在最初包含它的地方添加信息即可。因此,保持对所有问题和答案的修订控制,这样我们就可以看到更改的内容以及需要更改的时间。清晰易读比每周记笔记和改变更重要。
def translates_many_words(str)
  str = str.split

  # line under - is a shortcut from `return nil if str.size <= 2`
  # `#size` is more relative to this context if you will count elements of array 
  return unless str.size > 2 

  # Now, when we excluded possibility of work with array that have less then 2 elements, 
  # we can continue with our iteration
  str.map do |item| 
    begins_with_consonant(item) || word_begins_with_vowel(item)
  end.join(' ')
end