我想將字符串分成不等大小的塊(由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"]
我想將字符串分成不等大小的塊(由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"]
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"]
+1。很不錯的感覺。在你的第二個版本中,&符號是做什麼的? –
將'Proc'對象傳遞給'map' –
這可能是效率較低,因爲它修改原始字符串很多,但如何:
row = lengths.collect { |n| s.slice!(0..(n-1)).strip }
正是我在找的東西。謝謝。 –
我比較喜歡維克多的解包解決方案,雖然他們可能會對許多rubiest有點模糊。 inject
可以是多一點平淡:
lens.inject([0]) {|spans,len|
start = spans.pop
spans << s[start,len].strip << start+len
}[0...-1]
使用健全的變量名等'lengths'和'length'(「透鏡」是一個完全不同的字具有不同的含義),且使用'做一個/ end'多行代碼塊,在*'s [i,i + len] .strip'之後將'i + = length'移動到*會使代碼更加「習慣用法」,但不是,沒有魔術符號可以將它重寫爲單線或什麼的。 – meagar
@meagar:在收到子字符串後,不會移動'+ ='將錯誤的東西指向'collect'? –