Почему нет String # shift()?

Я прокладываю себе путь через Project Euler и столкнулся с немного неожиданным упущением: нет String#shift, unshift, push или pop. Я предположил, что String считается "последовательным" объектом, таким как Array, поскольку они делятся способностью индексироваться и проходить через и что это будет включать возможность легко изменять начало и конец объекта.

Я знаю, что есть способы создать одни и те же эффекты, но есть ли конкретная причина, по которой у String не есть эти методы?

Ответы

Ответ 1

Строки не действуют как перечислимый объект с 1,9, так как считалось слишком запутанным, чтобы решить, что это был бы список:

  • Список символов/кодовых точек?
  • Список байтов?
  • Список строк?

Ответ 2

Не будучи вкладчиком Ruby, я не могу говорить с их проектами, но из опыта я не думаю, что строки рассматриваются как "последовательные" объекты; они изменяются способами, которые предполагают последовательное поведение, но большую часть времени их обрабатывают атомарно.

Пример: в Ruby 1.9, String больше не смешивается в Enumerable.

Ответ 3

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

это должно сделать это, вам нужно было бы преобразовать его в массив, а затем вернуться, хотя

UPDATE:

используйте String#chop! и Stirng#<<

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

Ответ 4

Хорошо хотя бы в 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!"