Я думаю, что ваши предположения верны. Когда массив приводится к типу string
, получается единственное строковое значение, потому что (a) можно представить массив в виде строки, (b) это приведение поддерживается и (c), как вы заметили, нам нужно эта возможность для таких вещей, как ввод / вывод. Это справедливо для большинства типов, поэтому правило, которое «выигрывает» в этом случае, - «выражения произвольных типов обычно поддерживают приведение к строке в часовне».
В отличие от этого, когда массив int
приведен к real
(скажем), нет никакого определения, определенного из массивов в вещественные числа. Однако существует преобразование, определенное от int
до real
, поэтому правила продвижения массива Chapel вступают в силу, и приведение применяется к каждому элементу массива параллельно. Фактически, выражение arr: real
переписывается как [e in arr] e: real
.
. Это также предлагает способ, которым вы могли бы получить массив строковых результатов, если это то, что вы хотели для конкретного случая c: итерация по массив, приводящий каждый элемент к строке ( TIO ):
var arr = [1,2,3];
writeln( arr );
writeln( arr.type:string );
var s = [e in arr] e:string;
writeln( s );
writeln( s.type:string );
(и эта форма должна работать одинаково для любого допустимого приведения типа элемента, это просто немного больше, чем печатать, чем сокращение, которое позволяет продвижение, но в общем случае c это может быть уместно).