Scala - null (?) В качестве значения по умолчанию для именованного параметра Int - PullRequest
7 голосов
/ 23 января 2012

Я бы хотел сделать в Scala то, что я бы сделал в Java, например:

public void recv(String from) {
    recv(from, null);
}
public void recv(String from, Integer key) {
    /* if key defined do some preliminary work */
    /* do real work */
}

// case 1
recv("/x/y/z");
// case 2
recv("/x/y/z", 1);

В Scala я мог бы сделать:

def recv(from: String,
         key: Int = null.asInstanceOf[Int]) {
    /* ... */
}

но выглядит уродливо. Или я мог бы сделать:

def recv(from: String,
         key: Option[Int] = None) {
    /* ... */
}

но теперь звонок с ключом выглядит некрасиво:

// case 2
recv("/x/y/z", Some(1));

Какой правильный способ Скалы ? Спасибо.

Ответы [ 3 ]

15 голосов
/ 23 января 2012

Option - это путь Скалы.Вы можете сделать пользовательский код немного лучше, предоставив вспомогательные методы.

private def recv(from: String, key: Option[Int]) {
  /* ... */
}

def recv(from: String, key: Int) {
  recv(from, Some(key))
}

def recv(from: String) {
  recv(from, None)
}

null.asInstanceOf[Int], кстати, оценивается как 0.

3 голосов
/ 23 января 2012

Option действительно звучит как правильное решение вашей проблемы - вы действительно хотите иметь «опционально» Int.

, если вы беспокоитесь о том, что вызывающим абонентам нужно использовать Someпочему бы и нет:

def recv(from: String) {
  recv(from, None)
}

def recv(from: String, key: Int) {
  recv(from, Some(key))
}

def recv(from: String, key: Option[Int]) {
  ...
}
2 голосов
/ 23 января 2012

Правильный способ, конечно, использовать Option.Если у вас есть проблемы с тем, как это выглядит, вы всегда можете прибегнуть к тому, что вы делали в Java: используйте java.lang.Integer.

...