Имеет ли scala возможность использовать параметр по умолчанию с утиной печатью?

Имеет ли scala возможность использовать параметр по умолчанию с утиной печатью?

Код ниже выдает ошибку: здесь разрешены только объявления

def test(x: { def x(a:Int, b:Int = 5):Int} ) = x(1)


person kraken    schedule 21.03.2014    source источник
comment
а) Я в замешательстве. б) Это не утиная печать, не так ли?   -  person Millie Smith    schedule 21.03.2014
comment
Это утиная печать. Для тестовой функции требуется любой объект, который имеет соответствующий метод «x»   -  person kraken    schedule 21.03.2014
comment
Я не эксперт по Scala, но я думаю, вам нужно будет использовать трейты для этого. Я не думаю, что вы можете сделать то, что вы пытаетесь сделать с этим синтаксисом.   -  person Millie Smith    schedule 21.03.2014
comment
ХОРОШО. Я видимо ошибаюсь. Узнавайте что-то новое каждый день.   -  person Millie Smith    schedule 21.03.2014
comment
Я использую игровой фреймворк и хочу передать свое представление методу. Play framework компилирует представления из html-файлов, и я не меняю объект результата, чтобы использовать черту   -  person kraken    schedule 21.03.2014
comment
@MillieSmith - я не знаю, имеет ли утиная типизация принятое формальное определение, но обычно это называется структурной типизацией, а не утиной типизацией. Утиная типизация подразумевает позднее связывание, в то время как это статически проверяет тип ввода (хотя реализация может использовать отражение для выполнения вызова).   -  person Lee    schedule 21.03.2014
comment
@MillieSmith Мне очень нравится называть это статической утиной печатью.   -  person ghik    schedule 23.03.2014


Ответы (2)


Это довольно слащаво:

scala> def test(x: { def x(a:Int, b:Int):Int ; def x$default$2: Int } ) = x.x(1, x.x$default$2)
warning: there were 2 feature warning(s); re-run with -feature for details
test: (x: AnyRef{def x(a: Int,b: Int): Int; def x$default$2: Int})Int

scala> val y = new { def x(a: Int, b: Int = 5): Int = a + b }
y: AnyRef{def x(a: Int,b: Int): Int; def x$default$2: Int @scala.annotation.unchecked.uncheckedVariance} = $anon$1@232864a3

scala> test(y)
res0: Int = 6

Макрос мог бы проверить, что значением по умолчанию является определенное постоянное выражение, предположительно.

person som-snytt    schedule 21.03.2014

нет... вы не можете использовать параметр по умолчанию. Также ваш x(1) должен быть x.x(1), поскольку x, который вы пытаетесь вызвать, является методом x для параметра, также называемого x.

Вместо этого вы можете сделать что-то вроде:

def test(x: { def foo(a:Int,b:Option[Int]):Int }) = x.foo(1, b.getOrElse(5))

Или укажите трейт, определяющий метод с аргументами по умолчанию, и смешайте его со значениями, которые вы хотите передать этому методу.

person nairbv    schedule 21.03.2014
comment
Я использую игровой фреймворк и хочу передать свое представление методу. Play framework компилирует представления из html-файлов, и я не меняю объект результата, чтобы использовать черту - person kraken; 21.03.2014