基本猪拉丁语|麻烦与.each

时间:2016-08-07 20:22:23

标签: ruby

我正在解决基本的训练练习而且我被卡住了。我必须将每个单词的第一个字母移到它的末尾,然后在单词的末尾添加“ay”。。我一直在谷歌搜索并提出这个代码:

 def pig_it translate_pig_latin   
    move_letters = text.split(' ')
                       .each do {|x| x[1..-1] << x.[0] << 'ay' }
    move_letters.join(' ') 
 end

但由于某种原因,它给了我这个错误

  

-e:4:语法错误,意外'|',期待'}'       .each做{| x | x [1 ..- 1]&lt;&lt; X [0] &LT;&LT; 'ay'}

我知道这是.each方法的一个问题,但在阅读完文档并在谷歌上搜索后,我无法弄清楚它有什么问题。

2 个答案:

答案 0 :(得分:1)

使用 do ... end { ... }。不要像你一样将它们与do {混合使用。该行应如下所示:

.each { |x| x[1..-1] << x[0] << 'ay' }

.each do |x| x[1..-1] << x[0] << 'ay' end

从样式的角度来看,大多数Rubyists更喜欢将{ ... }用于单行块,并为跨越的块保留do ... end多行代码。

答案 1 :(得分:1)

def translate_pig_latin(text)
     move_letters = text.split(' ')
         .each { |x| return x[1..-1] << x[0] << 'ay' }
     move_letters.join(' ')     
end

一些注意事项 -

  • 正如其他用户所述,请勿混用do / end{}
  • 此外,使用括号表示法从数组中检索项目时,请不要像.
  • 中那样使用x.[0]
  • 您的.each区块正在执行正确的操作(当您遵守上述注释时)但未返回结果(我感到困惑)。如果您添加明确的return,那么您的代码将按上述方式运作

如果这可以帮助您更好地了解正在发生的事情,那么这是一种更为精简的方法

    def translate_pig_latin(text)
        # create array to contain piglatinified phrase
        new_phrase = []
        # each word of the original phrase do
        text.split(' ').each do |x|
            # grab the characters after the first character
            new_word = x[1..-1]
            # add the first character plus 'ay' to the end of the string
            new_word << x[0] + 'ay'
            # add the newly piglatinified string to the phrase
            new_phrase << new_word
        end
        # turn the phrase into a space separated string
        new_phrase.join(' ') 
    end