为什么没有String#shift()?

时间:2011-02-10 23:13:35

标签: ruby

我正在通过Project Euler工作,并略微遗漏:没有String#shiftunshiftpush或{{1} }。我假设String被认为是一个像“数组”这样的“顺序”对象,因为它们具有索引和迭代的能力,并且这包括轻松更改对象开头和结尾的能力。

我知道有很多方法可以创建相同的效果,但有一个特定的原因是String 有这些方法吗?

4 个答案:

答案 0 :(得分:12)

从1.9开始,字符串不会作为可枚举对象,因为它被认为太混乱而无法确定它是什么列表:

  • 字符/代码点列表?
  • 字节列表?
  • 行列表?

答案 1 :(得分:5)

不是Ruby的贡献者,我无法谈及他们的设计目标,但从经验来看,我不认为字符串被视为“顺序”对象;它们在表示顺序行为的方式上是可变的,但大部分时间它们都是以原子方式处理的。

例证:在Ruby 1.9中,String不再混合Enumerable

答案 2 :(得分:5)

>> mystring = "abcdefgh"
=> "abcdefgh"
>> myarray = mystring.split("")
=> ["a", "b", "c", "d", "e", "f", "g", "h"]
>> myarray.pop
=> "h"
>> mystring = myarray.join
=> "abcdefg"

这应该这样做,你可以将它转换为数组,然后返回

更新:

使用String#chop!Stirng#<<

>> s = "abc"
=> "abc"
>> s.chop!
=> "ab"
>> s
=> "ab"
>> s<<"def"
=> "abdef"
>> s
=> "abdef"
>> 

答案 3 :(得分:2)

至少在1.9.2中,你可以处理类似数组的字符串。

ruby-1.9.2-p290 :001 > "awesome"[3..-1] => "some" 

所以如果你想做一个左移的角色,只需使用[1 ..- 1]

ruby-1.9.2-p290 :003 > "fooh!"[1..-1] => "ooh!"