为什么我的 ruby #each 块不能作为单行工作

Why my ruby #each block is not working as a one-liner

这是我写的块:

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

它不是这样工作的,但如果我以 "do...end" 的方式写它,它会很好用:

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

这并不重要,因为我可以从长远来看使用我的整个方法,但我想了解 ruby 的单行方法。谢谢 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

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

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

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

解决方案

你的方法的目标是什么? 你想把你的阵列一分为二并交换两半吗? Array#rotate 正是这样做的:

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

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

现在你有了你的单线 ;)

备注

  • 如果您在方法的末尾使用 p,它将始终在 return 之前显示它。它可能并不总是令人满意的。不过,它仍然比 puts 好,因为否则您的方法会 return nil

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

  • each return是原来的数组,所以可以用count = half.each{|x| array << x}.size

  • count就是1+array.length/2,所以你也不需要前面的代码。

  • 您可能希望使用带有 space 的连接,以查看 [1,2,3][12,3]

  • 之间的区别
  • 最后,rotate 可能很难在文档中找到。但是你已经知道 drop, and drop mentions take.

所以你的代码可以变成:

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