Как Scala может получить несколько параметров в определении метода?

От WebService возвращает XML, даже когда ResponseFormat устанавливают на JSON:

Удостоверяются, что запрос является запросом POST, не ПОЛУЧАТЬ. Scott Guthrie имеет сообщение, объясняющее почему .

, Хотя это записано специально для jQuery, это может также быть полезно для Вас:
Используя jQuery для Потребления ASP.NET веб-сервисы JSON

30
задан Joe 7 January 2010 в 19:20
поделиться

2 ответа

def someMethod(values : Int*)

Дает массив. Поместите параметр переменного аргумента в качестве последнего формального параметра.

43
ответ дан 27 November 2019 в 23:10
поделиться

И Java, и Scala имеют varargs, и оба поддерживают его только для последних параметров.

 def varargTest(ints:Int*) { ints.foreach(println) }  

Из этой статьи разница заключается в типе, используемом для varargs arguments:

  • массив для Java
  • Seq (Sequence) для Scala: его можно повторять, и доступны многие методы, такие как коллекции foreach, map, filter, find, ...

'*' означает 0 или более аргументов.

Примечание: если значения параметров уже «упакованы» в виде последовательности, такой как список, это не удается:

# varargTest(List(1,2,3,4,5))  
# //--> error: type mismatch;  
# //-->  found   : List[Int]  
# //-->  required: Int  
# //-->        varargTest(List(1,2,3,4,5))  
# //--> 

Но это пройдет:

  varargTest(List(1,2,3):_*)  
  //--> 1  
  //--> 2  
  //--> 3  

' _ '- это ярлык-заполнитель для вывода типа. ' _ * ' здесь применяется к 'повторяющемуся типу.
В разделе 4.6.2 Спецификации Scala упоминается:

Последний параметр значения в разделе параметров может иметь суффикс «, например (..., x: T *) .
Тип такого повторяющегося параметра внутри метода тогда тип последовательности scala.Seq [T] .
Методы с повторяющимися параметрами T * принимают переменное количество аргументов типа T .

 (T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U, 

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

 (e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]).

Примечание бис: остерегайтесь стирания типов, лежащих в основе Java:

//--> error: double definition:
//--> method varargTest:(ints: Seq[Int])Unit and
//--> method varargTest:(ints: Int*)Unit at line 10
//--> have same type after erasure: (ints: Sequence)Unit
//-->   def varargTest(ints:Seq[Int]) { varargTest(ints: _*) }
49
ответ дан 27 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

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