2016-12-08 70 views
1

工作,这是我写的块:为什么我的红宝石#each块不是一个班轮

half.each { |x| array << x count+=1 } 

它只是不工作,像这样的,但如果我把它写了“做它的作品非常好。 ..end”的方式:

half.each do |x| 
    array << x 
    count+=1 
    end 

它不是真的很重要,因为我可以工作,我在很长的路要走整个方法,但我想了解红宝石的一行代码的方式。由于already.And如果需要的话,这是整个方法:

def length_even(array) 
    half = array[(0...array.length/2)] 
    count = 0 
    half.each do |x| 
    array << x 
    count+=1 
    end 
    p array.drop(count).join 
end 
+1

什么是'half'? –

+0

一半只是一个变量。我想把它命名为“一半” –

+0

“不工作”是什么意思?怎么了 ? –

回答

1

解决方案

什么是你的方法的目标是什么? 你是否想将数组拆分为2并切换两半? Array#rotate正是这么做的:

def length_even(array) 
    array.rotate(array.length/2).join 
end 

puts length_even([0,1,2,3,4,5]) #=> "345012" 

现在,你有你的单行;)

  • 如果你在你的方法结束使用p,它总是会显示它在返回之前。它可能并不总是可取的。尽管如此,它仍然优于puts,因为否则您的方法将返回nil

  • 您的代码修改了array,您可能不想这样做。

  • each返回原来的数组,所以你可以使用count = half.each{|x| array << x}.size

  • count只是1+array.length/2,这样你就不会需要任何以前的代码。

  • 您可能希望使用与空间的加入,看[1,2,3][12,3]

  • 之间的差别最后,rotate可能很难在文档中找到。但是您已经知道drop,而drop提到了take

所以,你的代码将变成:

def length_even(array) 
    half_size = array.length/2 
    (array.drop(half_size)+array.take(half_size)).join(' ') 
end 
1

half.each { |x| array << x count+=1 }

你的陈述在这里没有分开。通常,linebreak作为分隔符。但是,如果你想要把几个语句放在同一行,用;

half.each { |x| array << x; count+=1 } 
+0

@ReşitKörsu它不会,如果你在下一行代码。另外,你可以在这里使用'with_index',不用你自己定义一个计数器。 –

+0

@ReşitKörsu:不要忘记接受有用的答案:) –