Имеет ли scala возможность использовать параметр по умолчанию с утиной печатью?
Код ниже выдает ошибку: здесь разрешены только объявления
def test(x: { def x(a:Int, b:Int = 5):Int} ) = x(1)
Имеет ли scala возможность использовать параметр по умолчанию с утиной печатью?
Код ниже выдает ошибку: здесь разрешены только объявления
def test(x: { def x(a:Int, b:Int = 5):Int} ) = x(1)
Это довольно слащаво:
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
Макрос мог бы проверить, что значением по умолчанию является определенное постоянное выражение, предположительно.
нет... вы не можете использовать параметр по умолчанию. Также ваш 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))
Или укажите трейт, определяющий метод с аргументами по умолчанию, и смешайте его со значениями, которые вы хотите передать этому методу.