Ваш код будет прав в Pascal, но он не компилируется в Pascal Script.
В Pascal, если вы хотите присвоить возвращаемое значение функции, вы либо присваиваете значение «переменной» с именем функции, либо переменной Result
.
Итак, это правильно:
function GetRoot: string;
begin
GetRoot := ROOTPage.Values[0];
end;
И это тоже (оба эквивалентны):
function GetRoot: string;
begin
Result := ROOTPage.Values[0];
end;
В скрипте Pascal работает только Result
. Когда вы используете имя функции, вы получаете ожидаемый идентификатор .
Вы получаете это, когда функция вызванный из-за большого количества раздела Code
, и требуется конкретный список параметров / возвращаемое значение. Но вы не сказали нам, что вы используете для функции GetRoot
.
Есть два места, где вы можете использовать пользовательскую функцию в Inno Setup:
Check
параметр : для этого функция должна вернуть значение Boolean
и не принимать ни параметра, ни одного параметра (тип параметра определяется значением, которое вы предоставляете в параметре Check
). function MyProgCheck(): Boolean;
function MyDirCheck(DirName: String): Boolean;
string
и принимать один параметр string
, даже если в константе, заданной сценарием, не указана никакая опция. Я предполагаю, что это ваш прецедент. Если вам не нужен какой-либо параметр, просто объявите его, но не используйте его: function GetRoot(Param: String): string;
begin
Result := ROOTPage.Values[0];
end;
Вы можете использовать .find()
, чтобы вернуть первую функцию, не возвращающую ложь, и затем запустить ее снова, чтобы получить результат. Конечно, вы, вероятно, хотели бы иметь запасной вариант в случае, если все ваши функции возвращают ложные значения.
const a = () => false;
const b = () => false;
const c = () => "Hello world";
var aibot = [a, b, c].find(f => f()) || (() => false);
console.log(aibot());
function findFirstMatchingResult(arr, val){
for(let i = 0, len = arr.length; i < len; i++){
const result = arr[i]();
if(result === val){
return true;
}
}
return false;
}
// if you really want to make it generic, you could do the following:
function findFirstMatchingResult(arr, val){
return function(...params){
for(let i = 0, len = arr.length; i < len; i++){
const result = arr[i].apply(null, params[i]);
if(result === val){
return true;
}
}
return false;
}
}
findFirstMatchingResult([
function(str){
return str.length;
}
])([
'hello'
]);
Обобщенная версия (у функций могут быть аргументы) определенно немного громоздка, чтобы передавать массив для каждой функции, но это хорошая отправная точка. Это также было бы только для примитивов. Как === не будет работать для массива, объектов и т. Д.
Я думаю, что иногда тебе лучше с простой петлей. Это будет работать только до тех пор, пока первая функция не вернет true и вернет это значение без необходимости повторного вызова функции. Он вернет undefined
, если ни одна функция не вернет истинное значение. Вам нужно будет рассмотреть, следует ли игнорировать все неверные значения (например, 0
):
function a() { return false}
function b() {return 'result B'}
function c() { return 'result C'}
function takeFirst(arr){
for (let f of arr) {
let r = f()
if (r) return r
}
}
console.log(takeFirst([a, b, c]))