我正在通过Project Euler工作,并略微遗漏:没有String#shift
,unshift
,push
或{{1} }。我假设String被认为是一个像“数组”这样的“顺序”对象,因为它们具有索引和迭代的能力,并且这包括轻松更改对象开头和结尾的能力。
我知道有很多方法可以创建相同的效果,但有一个特定的原因是String 不有这些方法吗?
答案 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!"