Scala передача varargs в другую функцию, которая принимает varargs - PullRequest
2 голосов
/ 16 апреля 2020

Почему varargs нельзя передать как varargs без :_*?

object Main {

  def main(s: Array[String]): Unit = {


    def someFunction(varars: String*) = {
      someOtherFunction(varars) // Compilation ERRRO 
      someOtherFunction(varars:_*) // Works, but why ?  
    }

    def someOtherFunction(someOtherVarars: String*): Unit = {
    }
  }
}

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Это потому, что varars - это единственный аргумент - массив строк (обратите внимание, что я не пишу Array[String], потому что это не java Array, более подробно здесь ), тогда как, глядя на подпись def someOtherFunction(someOtherVarars: String*): Unit, мы можем сказать, что someOtherFunction принимает несколько аргументов типа String каждый. Вы не можете просто передать массив в качестве параметра в someOtherFunction, вам нужно сначала «развернуть» его.

Другими словами, аргумент может быть передан в someOtherFunction, он должен быть помечен как аргумент последовательности , Не было бы особого смысла передавать varargs и varargs(1) в одну функцию. Это описано в SLS §4.6.2 .

2 голосов
/ 16 апреля 2020

Параметр «varargs» означает, что он может принимать любое количество строк в качестве аргумента (т. Е. Поле varargs).

def someFunction (varars: String *): Seq [String] = {varars}

, если вы определите вышеупомянутый метод и проверите для типа «varars» его теперь стал Seq [String], когда вы его используете. Но когда вы передаете его другому методу, который ожидает тип variableArgs. Это несоответствие, поскольку он стал Seq [String], который должен быть преобразован в переменные аргументы с помощью оператора (someOtherVarars: _ *).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...