6

什么是最优雅的做事方式

'string'
=> ['s', 'st', 'str', 'stri', 'strin', 'string']

我一直在想一个班轮,但我不能完全做到。
欢迎任何解决方案,谢谢。

4

6 回答 6

12

这个怎么样?

s = 'string'
res = s.length.times.map {|len| s[0..len]}
res # => ["s", "st", "str", "stri", "strin", "string"]
于 2013-05-13T09:01:40.257 回答
6

我能想出的更具声明性:

s = "string"
1.upto(s.length).map { |len| s[0, len] } 
#=> ["s", "st", "str", "stri", "strin", "string"]
于 2013-05-13T09:04:58.200 回答
5

您可以在标准库中使用缩写

require 'abbrev'
s = Abbrev::abbrev(['string']).keys
puts s.inspect

在需要 Abbrev 库后,我必须添加另一种使用方式,并将 .abbrev 方法添加到 Array:

require 'abbrev'
s = ['string'].abbrev.keys
puts s.inspect

如果订单对匹配您在问题中的回报很重要,请致电.sortkeys

于 2013-05-13T09:10:01.800 回答
5
s.chars.zip.inject{ |i,j| i << i.last + j.first }
于 2013-05-13T09:17:04.587 回答
0

另一个变体(这将在结果中包含空字符串):

s.each_char.inject([""]) {|a,ch| a << a[-1] + ch}

这个

  • 以包含空字符串的数组开头[""]
  • 对于字符串中的每个字符 ch,将 ch 附加到最后一个结果a[-1] + ch
  • 将此添加到结果数组
于 2013-05-13T09:11:16.807 回答
0
s = "string"
s.each_char.with_object([""]){|i,ar| ar << ar[-1].dup.concat(i)}.drop(1)
#=> ["s", "st", "str", "stri", "strin", "string"]
于 2013-05-13T14:04:09.913 回答