Объявление конструктора класса ... Два способа объявить одно и то же? - PullRequest
6 голосов
/ 16 февраля 2012

Я хотел бы объяснить разницу, например, между этой декларацией:

class Clazz(param1: String, param2: Integer)

и этот:

class Clazz(param1: String)(param2: Integer)

Влияет ли второе объявление только на способ создания объектов или есть какая-то более глубокая причина, о которой я не знаю.

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

class Clazz(param1: String*)(param2: Integer*)

Так есть ли другие?

Ответы [ 2 ]

11 голосов
/ 16 февраля 2012

# 1 Тип вывода. Он идет слева направо и выполняется по списку параметров.

scala> class Foo[A](x: A, y: A => Unit)
defined class Foo

scala> new Foo(2, x => println(x))
<console>:24: error: missing parameter type
              new Foo(2, x => println(x))
                         ^

scala> class Foo[A](x: A)(y: A => Unit)
defined class Foo

scala> new Foo(2)(x => println(x))
res22: Foo[Int] = Foo@4dc1e4

# 2 Список неявных параметров.

scala> class Foo[A](x: A)(implicit ord: scala.Ordering[A]) {
     |   def compare(y: A) = ord.compare(x, y)
     | }
defined class Foo

scala> new Foo(3)
res23: Foo[Int] = Foo@965701

scala> res23 compare 7
res24: Int = -1

scala> new Foo(new {})
<console>:24: error: No implicit Ordering defined for java.lang.Object.
              new Foo(new {})
              ^
3 голосов
/ 16 февраля 2012

Во второй версии вы объявляете карри первичного конструктора для Clazz.Таким образом, разница между этими двумя версиями такая же, как разница между «обычными» и карри функциями в Scala, т.е.

def foo(param1: String, param2: Int)

def foo(param1: String)(param2: Int)

Большую часть времени оба объявления могут использоваться взаимозаменяемо, но если вам часто требуется функция карритогда имеет смысл объявить это в форме карри.Обратите внимание, что вы также можете преобразовать обычную функцию или даже конструктор в форму с карри, например, вы можете преобразовать ваш обычный конструктор Clazz в форму с карри, используя это:

(new Clazz(_, _)).curried

Вам также нужно несколько списков параметров, если вы передаетенеявное значение (поскольку ключевое слово implicit относится ко всему списку параметров)

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