Ошибка времени компиляции при использовании переменных параметров с передачей функции в качестве параметра в другую функцию [duplicate]

Я знаю, что это должно звучать глупо ... но редко бывает.

Проверьте, пытаетесь ли вы выполнить php из

**http://localhost/info.php**

, а не из

file:///var/www/info.php

ps> вы можете заметить, что если вы пишете из shell

php info.php 

, то ответьте на код (это означает php-функции) ..

22
задан Deduplicator 21 November 2014 в 01:30
поделиться

3 ответа

Я не думаю, что он должен использовать .reduce. Вместо этого просто измените определение параметра в его функции sumOf. Вместо:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

записать:

func sumOf(numbers: [Int]) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
-2
ответ дан RobertL 21 August 2018 в 17:16
поделиться
  • 1
    Это нехорошее решение, потому что я хочу, чтобы вариационная версия функции (требуемый синтаксис) желательна для того, чтобы пользователь мог позвонить. – bearMountain 12 August 2014 в 07:03

Как и в Swift 4.1 (в Xcode 9.2), нет необходимости перегружать sumOf (_ numbers: Int ...), функция, которая передает переменные (ы) вперед, изменяет ее на один параметр массива отдельных параметров (ов). Например. следующий код будет работать без перегрузки:

// This function does the actual work
func sumOf(_ numbers: [Int]) -> Int {
    return numbers.reduce(0, +) // functional style with reduce
}

func averageOf(_ numbers: Int...) -> Int {
    // This calls the first function directly
    return sumOf(numbers) / numbers.count
}

print (averageOf (2, 5, 1))

Не знаю, является ли это ошибкой компилятора или не:)

0
ответ дан Tony Wan 21 August 2018 в 17:16
поделиться

Это не имеет ничего общего с кортежами. Во всяком случае, невозможно преобразовать из массива в кортеж в общем случае, поскольку массивы могут иметь любую длину, а arty кортежа необходимо знать во время компиляции.

Однако, вы можете решить свою проблему, предоставив перегрузки:

// This function does the actual work
func sumOf(_ numbers: [Int]) -> Int {
    return numbers.reduce(0, +) // functional style with reduce
}

// This overload allows the variadic notation and
// forwards its args to the function above
func sumOf(_ numbers: Int...) -> Int {
    return sumOf(numbers)
}

sumOf(2, 5, 1)

func averageOf(_ numbers: Int...) -> Int {
    // This calls the first function directly
    return sumOf(numbers) / numbers.count
}

averageOf(2, 5, 1)

Возможно, есть лучший способ (например, Scala использует специальный тип, чтобы избежать необходимости перегрузки, вы можете писать в Scala sumOf(numbers: _*) изнутри averageOf без определения двух функций), но я не нашел его в документах.

24
ответ дан vacawama 21 August 2018 в 17:16
поделиться
  • 1
    Как это не имеет ничего общего с кортежами? ОП пытается передать кортеж функции. – 68cherries 4 June 2014 в 20:49
  • 2
    @ 68cherries OP ошибается в отношении того, что кортежи. Это решает его актуальную проблему. – Jean-Philippe Pellet 4 June 2014 в 20:50
  • 3
    Я предположил, что функции берут кортеж в качестве списка аргументов. Разве это не так? – bearMountain 4 June 2014 в 20:53
  • 4
    Нет. Аргументы Variadic обертываются массивом. – Jean-Philippe Pellet 4 June 2014 в 20:58
  • 5
    также любопытно узнать, есть ли следствие _* в scala – wfbarksdale 8 August 2014 в 00:51
Другие вопросы по тегам:

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