Как создать файл функции в Ocatve с несколькими функциями - PullRequest
0 голосов
/ 05 августа 2020

Я знаю, что вы можете создать файл функции в Octave, в котором имя файла совпадает с именем функции, которая определяет одну функцию, но я хотел бы определить несколько функций в одном файле. Есть ли способ сделать это, или мне нужен отдельный файл для каждой функции.

1 Ответ

4 голосов
/ 05 августа 2020

В этом ответе я предполагаю, что ваша основная цель - аккуратное рабочее пространство, а не явное требование одного файла.

Давайте избавимся от подхода с одним файлом. Вы можете создать скрипт m-файл (не m-файл функции) и определить в нем несколько функций командной строки . В руководстве по октаве есть раздел об этом . Вот пример:

% in file loadfunctionDefinitions.m
1;   % statement with side-effect, to mark this file as a script. See docs.
function Out = Return1(); Out = 1; end
function Out = Return2(); Out = 2; end
% ... etc

% in your main octave session / main script:
X = Return1() + Return2();

Однако обычно это не рекомендуется. Особенно, если вам потребуется код, совместимый с Matlab, поскольку Matlab представил `` локальные для скрипта функции '' намного позже, чем октаву, и решил сделать это способом, несовместимым с существующей реализацией октавы: Matlab ожидает локальные для скрипта функции будет определено в конце сценария; octave ожидает, что они будут определены перед первым использованием. Однако, если вы используете обычные файлы функций, все в порядке.

Хотя я ценю настрой «Мне не нравится папка, полная функций», подход «одна функция на файл» на самом деле имеет много преимуществ (особенно если вы программируете из терминала, что делает множество инструментов вдвое полезнее). Например, вы можете легко использовать grep, чтобы найти, какие функции используют конкретную переменную. Или сравните изменения в отдельных функциях из разных коммитов, et c.

Обычно проблема заключается в том, что такие файлы функций засоряют каталог, когда присутствуют другие важные файлы, например data et c, а наличие такого количества файлов в одном месте затрудняет поиск того, что вы хотите, и создает ощущение неопрятности. Но вместо того, чтобы иметь один файл с определениями командной строки, вы можете использовать ряд других подходов, которые, вероятно, также лучше с программной точки зрения, например:

  • Просто создайте папку «вспомогательные функции» и добавьте ее в свой путь.
  • Используйте подфункции в своих основных функциях, когда это необходимо, чтобы минимизировать количество ненужных файлов
  • Используйте частные функции папка
  • Используйте 'каталог пакета' , т.е. папку, начинающуюся с символа '+', которая создает пространство имен для функций, содержащихся внутри. Например, ~/+MyFunctions/myfun.m будет доступен из ~/ через MyFunctions.myfun(), без необходимости добавлять +MyFunctions к пути (на самом деле вы не должны этого делать).
  • Создайте правильный класс каталог и сделайте свои функции методами этого класса

Последний вариант может также обеспечить однофайловое решение, если вы используете класс на основе classdef в более новом стиле, который позволяет вам для определения методов в том же файле, что и определение класса. Однако обратите внимание, что поддержка октавы для классов, определенных classdef, все еще несколько ограничена .

...