2016-12-06 14 views
0

这是Ruby中的Pig Latin translate practice如何在Ruby中进行字符串切片

为什么我从这两个版本的代码中获得不同的结果?换句话说,为什么word = word[i..-1]在第二个代码块中不起作用?

def translate(input) 
    output_array = input.split(" ").each do |word| 

     i=0 
     while !['a', 'e', 'i', 'o', 'u'].include?(word[i]) 
     i += 1 
     end 

     unless i == 0 
     word << word[0..i-1] 
     word[0..i-1] = '' 
     end 

     word << "ay" 

    end 
    return output_array.join(" ") 
end 

puts translate('apple') 
puts translate('banana') 
puts translate('trash') 
puts translate('eat pie') 

,其输出:

appleay 
ananabay 
ashtray 
eatay iepay 

和:

def translate(input) 
    output_array = input.split(" ").each do |word| 

     i=0 
     while !['a', 'e', 'i', 'o', 'u'].include?(word[i]) 
     i += 1 
     end 

     unless i == 0 
     word << word[0..i-1] 
     word = word[i..-1] 
     end 

     word << "ay" 

    end 
    return output_array.join(" ") 
end 

puts translate('apple') 
puts translate('banana') 
puts translate('trash') 
puts translate('eat pie') 

打印出:

appleay 
bananab 
trashtr 
eatay piep 

回答

0
output_array = input.split(" ").each do |word| 

    i=0 
    while !['a', 'e', 'i', 'o', 'u'].include?(word[i]) 
    i += 1 
    end 

    unless i == 0 
    word << word[0..i-1] # Good 
    word = word[i..-1] # Bad 
    end 

    word << "ay" 

end 

线

word << word[0..i-1] 

改变的地方串,而

word = word[i..-1] 

创建一个新字符串并分配新的字符串word。更换新的字符串不影响数组中的旧字符串,所以数组中的话留什么,他们后

word << word[0..i-1] 

难道每次修改就地(就像你在溶液中做了什么1),或使用Array#map这更像Ruby。

这是题外话,但你while回路可以通过

i = word.index(/[aeiou]/) 

,如果你碰巧知道正则表达式来代替。