История изменений
Исправление Anatolik, (текущая версия) :
В Ruby Array это именно массив строк?
В Ruby Array — это массив элементов, которые могут быть преобразованы в строку. Соответственно, еще до рантайма, для любого массива #join без аргументов и с корректным аргументом гарантирует, что возвращена будет строка.
Но можно гарантировать хотя бы в рантайме. И питон это делает, как видишь из своего же примера.
Что именно гарантирует питон?
Контейнер это всего лишь набор объектов, он не может поддерживать операцию join(), т.к. гетерогенен и ему пофиг на тип включаемых в себя объектов, он о них ничего не знает.
С моей точки зрения, это один из главных недостатков питона.
Конкатенация это только свойство строк.
А это что? Конкатенация — это не только свойство строк.
В Py эту ситуацию обработали достаточно корректно, операция join() берёт на вход итератор за которым может быть не только массив и не только контейнер.
В документации указана следующая сигнатура — str.join(iterable). Дано определение iterable.
Мне обещают, что если я передам этому методу iterable, то все будет в порядке. И когда я передаю ему [1,2,3], валидный iterable, я начинаю чувствовать себя несколько обманутым.
Конечно, я понимаю, что там есть эта приписочка — «A TypeError will be raised if there are any non-string values in iterable, including bytes objects.». Но эта приписочка, почему, черт возьми, она никак не отражена в сигнатуре? Для меня это является показателем того, что система типов в этом языке продумана недостаточно хорошо. В Ruby меня так никогда не обманывали.
Исходная версия Anatolik, :
В Ruby Array это именно массив строк?
В Ruby Array — это массив элементов, которые могут быть преобразованы в строку. Соответственно, еще до рантайма, для любого массива #join без аргументов и с корректным аргументом гарантируется, что возвращена будет строка.
Но можно гарантировать хотя бы в рантайме. И питон это делает, как видишь из своего же примера.
Что именно гарантирует питон?
Контейнер это всего лишь набор объектов, он не может поддерживать операцию join(), т.к. гетерогенен и ему пофиг на тип включаемых в себя объектов, он о них ничего не знает.
С моей точки зрения, это один из главных недостатков питона.
Конкатенация это только свойство строк.
А это что? Конкатенация — это не только свойство строк.
В Py эту ситуацию обработали достаточно корректно, операция join() берёт на вход итератор за которым может быть не только массив и не только контейнер.
В документации указана следующая сигнатура — str.join(iterable). Дано определение iterable.
Мне обещают, что если я передам этому методу iterable, то все будет в порядке. И когда я передаю ему [1,2,3], валидный iterable, я начинаю чувствовать себя несколько обманутым.
Конечно, я понимаю, что там есть эта приписочка — «A TypeError will be raised if there are any non-string values in iterable, including bytes objects.». Но эта приписочка, почему, черт возьми, она никак не отражена в сигнатуре? Для меня это является показателем того, что система типов в этом языке продумана недостаточно хорошо. В Ruby меня так никогда не обманывали.