2012-04-03 3 views

ответ

22

Если вы знаете, что строка содержит массив, вы можете просто использовать eval;

arr = eval(str) 

Если вы не уверены, вы можете пойти на немного сложнее, удаление скобок, расщепление на , и собирая номера в массиве;

arr = str[1..-2].split(',').collect! {|n| n.to_i} 

Демонстрация обоих here.

+6

Стоп, ковбой! Не так быстро. Eval очень опасен. Если бы страница исходила от злых междоузлий, например, как парам, ваше приложение могло бежать НИКОГДА. Представьте себе, что хакер меняет этот параметр str из «[123,456,789]» на «User.destroy_all». Вы более безопасны со вторым вариантом и разбираете идентификаторы. – IAmNaN

2

Простейшая вещь - это что-то вроде arr = eval(str), но это не очень безопасно. Другой вариант - сделать что-то вроде arr = str.gsub(/\[|\]/,'').split(/,/).map(&:to_i) - удалить круглые скобки из исходной строки, разбить на запятые, а затем преобразовать полученные фрагменты строки в целые числа.

4
str = "[123, 345, 567]" 

1) eval(str) 

2) str = "[123, 345, 567]".scan(/\d+/) # Make the array 
str.map!{ |s| s.to_i } # convert into integer 
1

Для проектов Rails я обнаружил, что встроенный декодер ActiveSupport JSON является прекрасным решением. Просто оберните строку в формате JSON, декодирует его, а затем возвращает новый массив:

def to_a(str) 
    wrapped_str = "{ \"wrapper\": #{str} }" 

    ActiveSupport::JSON.decode(wrapped_str)['wrapper'] rescue str 
end 

str = '[1, 2, [3, [4, 5, true, "a", {"test": "whee"}]]]' 
str_to_a = to_a(str) 

Это возвращает массив, пока строка является действительным JSON. Если декодирование завершится неудачно, исходная строка будет возвращена. Обратите внимание, что действительный JSON в этом случае относится только к содержимому массива - если массив строк содержит любые хеши (здесь идет оговорка), все хеш-ключи должны быть заключены в double цитаты. Также обратите внимание, что логические значения будут забрасываться только в booleans, если они не являются, заключенными в кавычки.

Возврат исходной строки при ошибке декодирования позволяет преобразовать строки только там, где это удается (оставив остальные строки без изменений). Кроме того, вы можете заставить все использовать массив (или пустой массив), используя вместо этого rescue [].

Смежные вопросы