Хорошая практика JavaScript - запускать много функций / объектов один за другим, пока не найдете результат

Ожидаемый идентификатор

Ваш код будет прав в 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;
    
  • Scripted Constants : функция должна возвращать значение string и принимать один параметр string, даже если в константе, заданной сценарием, не указана никакая опция. Я предполагаю, что это ваш прецедент. Если вам не нужен какой-либо параметр, просто объявите его, но не используйте его:
    function GetRoot(Param: String): string;
    begin
      Result := ROOTPage.Values[0];
    end;
    
-1
задан Shapon Pal 15 January 2019 в 21:34
поделиться

3 ответа

Вы можете использовать .find() , чтобы вернуть первую функцию, не возвращающую ложь, и затем запустить ее снова, чтобы получить результат. Конечно, вы, вероятно, хотели бы иметь запасной вариант в случае, если все ваши функции возвращают ложные значения.

const a = () => false;
const b = () => false;
const c = () => "Hello world";

var aibot = [a, b, c].find(f => f()) || (() => false);
console.log(aibot());

0
ответ дан Tyler Roper 15 January 2019 в 21:34
поделиться
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'
]);

Обобщенная версия (у функций могут быть аргументы) определенно немного громоздка, чтобы передавать массив для каждой функции, но это хорошая отправная точка. Это также было бы только для примитивов. Как === не будет работать для массива, объектов и т. Д.

0
ответ дан Mike Zinn 15 January 2019 в 21:34
поделиться

Я думаю, что иногда тебе лучше с простой петлей. Это будет работать только до тех пор, пока первая функция не вернет 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]))

0
ответ дан Mark Meyer 15 January 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: