2012-10-19 55 views
1

我想將字符串分成不等大小的塊(由lens給出)。我的代碼工作,但不喜歡慣用的Ruby。有什麼建議麼?將不同長度的字符串分塊

s = "red 4827spoon  jimmy john " 
lens = [6, 4, 12, 13] 
i = 0 
row = lens.collect {|len| 
    i += len 
    s[i-len, len].strip 
} 

給人

["red", "4827", "spoon", "jimmy john"] 
+0

使用健全的變量名等'lengths'和'length'(「透鏡」是一個完全不同的字具有不同的含義),且使用'做一個/ end'多行代碼塊,在*'s [i,i + len] .strip'之後將'i + = length'移動到*會使代碼更加「習慣用法」,但不是,沒有魔術符號可以將它重寫爲單線或什麼的。 – meagar

+0

@meagar:在收到子字符串後,不會移動'+ ='將錯誤的東西指向'collect'? –

回答

1
s = "red 4827spoon  jimmy john " 
lens = [6, 4, 12, 13] 
p s.unpack(lens.map{ |i| "A#{i}" }.join) #=>["red", "4827", "spoon", "jimmy john"] 
p s.unpack(lens.map(&"A%d".method(:%)).join) #=> ["red", "4827", "spoon", "jimmy john"] 
+0

+1。很不錯的感覺。在你的第二個版本中,&符號是做什麼的? –

+0

將'Proc'對象傳遞給'map' –

2

這可能是效率較低,因爲它修改原始字符串很多,但如何:

row = lengths.collect { |n| s.slice!(0..(n-1)).strip } 
+0

正是我在找的東西。謝謝。 –

1

我比較喜歡維克多的解包解決方案,雖然他們可能會對許多rubiest有點模糊。 inject可以是多一點平淡:

lens.inject([0]) {|spans,len| 
    start = spans.pop 
    spans << s[start,len].strip << start+len 
}[0...-1] 
相關問題