Многострочный строковый литерал в Matlab?

существует ли многострочный строковый литеральный синтаксис в Matlab или необходимо объединить несколько строк?

нашел дословно пакет, но он работает только в m-файле или функции, а не интерактивно в ячейках редактора.

EDIT: я особенно после удобочитаемости и легкости изменения литерала в коде (представьте, что он содержит отступы блоков разных уровней) - легко сделать многострочные строки, но я ищу наиболее удобный sytax для этого.

пока у меня есть

t = {...
'abc'...
'def'};
t = cellfun(@(x) [x sprintf('n')],t,'Unif',false);
t = horzcat(t{:});

который дает размер (t) = 1 8, но, очевидно, немного беспорядок.

EDIT 2: в основном verbatim делает то, что я хочу, за исключением того, что он не работает в ячейках редактора, но, возможно, мой лучший выбор-обновить его. Я думаю, что должно быть возможно получить текущий открытый файл и позицию курсора из интерфейса java в Редактор. Проблема была бы, если бы в одной ячейке было несколько дословных вызовов, как не могли бы вы различить их?

2 ответов


Matlab является странным в том, что обработка escape в строках является функцией printf семейство функций вместо синтаксиса строкового литерала. И никаких многострочных литералов. Ну что ж.

в итоге я сделал две вещи. Во-первых, сделайте CR() и LF() функции, которые просто возвращают обработанные \r и \n соответственно, поэтому вы можете использовать их как псевдо-литералы в своем коде. Я предпочитаю делать это, а не отправлять целые строки через sprintf(), потому что могут быть другие обратные косые черты там вы не хотели обрабатывать как escape-последовательности (например, если некоторые из ваших строк пришли из аргументов функции или ввода, прочитанного из другого места).

function out = CR()
out = char(13); % # sprintf('\r')

function out = LF()
out = char(10); % # sprintf('\n');

во-вторых, сделать join(glue, strs) функция, которая работает как соединение Perl или код cellfun / horzcat в вашем примере, но без конечного разделителя.

function out = join(glue, strs)
strs = strs(:)';
strs(2,:) = {glue};
strs = strs(:)';
strs(end) = [];
out = cat(2, strs{:});

а затем используйте его с литералами ячеек, как вы это делаете.

str = join(LF, {
    'abc'
    'defghi'
    'jklm'
    });

вам не нужно "..."эллипсы в клеточных литералах, как это; опущение их делает вертикальную векторную конструкцию, и это нормально, если строки имеют разную длину строк символов, потому что они застревают внутри ячейки. Уже одно это сэкономит вам время.


Я бы пошел на:

multiline = sprintf([ ... 
'Line 1\n'... 
'Line 2\n'... 
]);