2015-10-28 3 views
9

Учитывая следующие функции с дополнительными параметрами:Как пропустить дополнительные параметры в Scala?

def foo(a:Int = 1, b:Int = 2, c:Int = 3) ... 

Я хочу, чтобы сохранить значение по умолчанию в но передать новые значения б и гр только позиционной уступки (а не поименованный присвоение), то есть любой из следующих синтаксисов был бы хорош:

foo(, 5, 7) 
foo(_, 5, 7) 

Возможно ли что-то подобное с Scala?

+1

Почему бы не маркировать параметры? –

+0

Мне просто интересно, возможно ли это на других языках? как Python, R, Java? –

+0

@Tripp: Повторение всех имен параметров (возможно, даже более длинных имен) при каждом вызове функции вызывает раздражение. Я ленив :) Далее, я думаю, что отказ от аргументации очень ясен, недвусмыслен и даже прост в применении в спецификации языка. –

ответ

10

Там нет никакого способа, чтобы пропустить параметры, но вы можете использовать именованные параметры при вызове метода foo, например:

// Call foo with b = 5, c = 7 and the default value for a 
foo(b = 5, c = 7) 

редактировать - специально спросил вас, как сделать это с помощью позиционного задания: это невозможно в Scala.

4

Вы можете создать другую функцию с одним из применяемых параметров.

def long(a: Int = 1, b: Int = 2, c: Int = 3) = a + b + c 

def short(x: Int, y: Int) = long(b = x, c = y) 

val s = short(10, 20) // s: Int = 31 
1

раствор (далеко от довольно) может быть Currying

Вы должны были бы изменить сигнатуру метода немного:

// Just for "a" parameter 

def foo(a: Int = 1)(b: Int = 2, c: Int = 3) 

foo()(2,3) // 6 
foo(1)(2,3) // 6 
foo(2)(2,3) // 7 

Для всех параметров:

def foo(a: Int = 1)(b: Int = 2)(c: Int = 3) = a + b + c 

foo()()(3) // 6 
foo()(2)(3) // 6 
foo(2)()(3) // 7 
foo(3)()(3) // 8 
+0

Вы также можете использовать 'foo.curried' для преобразования foo в свою карриную форму без изменения сигнатуры метода. –

Смежные вопросы