Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 数组枚举工作不正常?_Ruby - Fatal编程技术网

Ruby 数组枚举工作不正常?

Ruby 数组枚举工作不正常?,ruby,Ruby,我正在创建一个方法(Pig Latin),但在这个示例测试用例中遇到了问题: translate(“eat pie”)应该返回“eatay iepay”,但我的代码似乎没有进行适当的更改 def translate(phrase) phrase = phrase.split.each do |word| if ['a', 'e', 'i', 'o', 'u'].include?(word[0]) word = word + 'ay' else ['a'

我正在创建一个方法(Pig Latin),但在这个示例测试用例中遇到了问题: translate(“eat pie”)应该返回“eatay iepay”,但我的代码似乎没有进行适当的更改

def translate(phrase)
  phrase = phrase.split.each do |word|
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0])
      word = word + 'ay'
    else
      ['a', 'e', 'i', 'o', 'u'].include?(word[1])? 
      word = word[1..-1] + word[0] + 'ay' : word = word[2..-1] + word[0..1] + 'ay'
    end
  end
  phrase.join(' ')
end

我遇到的问题是数组枚举根本不会处理每个单词。我不知道为什么会这样。提前谢谢

我想你是在找
收集
(或
地图
)而不是上面的
每个
。所以你的代码应该是:

def translate(phrase)
  phrase = phrase.split.collect do |word|
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0])
      word + 'ay'
    else
      if ['a', 'e', 'i', 'o', 'u'].include?(word[1])
        word[1..-1] + word[0] + 'ay' 
      else
        word[2..-1] + word[0..1] + 'ay'
      end
    end
  end
  phrase.join(' ')
end

附言:我对pig拉丁语不太了解,但你应该从这里弄明白。

你不能操纵你正在运行的
单词。而是使用
每个带索引的\u
来操作数组:

def translate(phrase)
  phrase_array = phrase.split
  phrase_array.each_with_index do |word, i|
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0])
      phrase_array[i] = word + 'ay'
    else
      ['a', 'e', 'i', 'o', 'u'].include?(word[1])? 
      phrase_array[i] =  word[1..-1] + word[0] + 'ay' : word = word[2..-1] + word[0..1] + 'ay'
    end
  end
  phrase.join(' ')
end

each
方法只是为列表的每个元素执行块。修改控制变量
word
不会影响列表的原始元素

我建议您使用
map
方法,将一个列表转换为另一个列表。它将原始列表的每个元素传递给块,并用块返回的值替换它

此外,您应该只使用条件运算符
a?b:d
返回值-不应修改任何变量。这样你就可以写作了

word = ['a', 'e', 'i', 'o', 'u'].include?(word[1]) ?
    word[1..-1] + word[0] + 'ay' :
    word[2..-1] + word[0..1] + 'ay'
但这里最好只使用一个附加的
elsif
子句

此代码符合您的要求

def translate(phrase)

  phrase = phrase.split.map do |word|
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0])
      word + 'ay'
    elsif ['a', 'e', 'i', 'o', 'u'].include?(word[1])
      word[1..-1] + word[0] + 'ay'
    else
      word[2..-1] + word[0..1] + 'ay'
    end
  end

  phrase.join(' ')
end

p translate "eat pie"
输出

"eatay iepay"
"igpay atinlay"

更新

使用正则表达式编写这篇文章要好得多。您可能对这种变化感兴趣

def translate(phrase)
  phrase.split.map { |word| word.sub /^([^aeiou]*)(.+)/, '\2\1ay' }.join ' '
end

p translate 'pig latin'
输出

"eatay iepay"
"igpay atinlay"

除非您的意思是
elsif
,否则您的
else
语句中不能有条件。