Можно ли узнать, был ли задан аргумент по умолчанию в качестве фактического значения параметра (если они равны) в Scala? - PullRequest
3 голосов
/ 05 октября 2011

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

def myMethod(x: Int = 1) = x + 1

Тогда можно различить эти два вызова (которые возвращают идентичные результаты, поскольку параметр во втором вызове метода имеет то же значение, что и значение по умолчанию)значение в определении метода) в теле метода:

myMethod()
myMethod(1)

Другими словами, я хочу знать, существует ли метод для достижения эффекта, аналогичного функции -supplied-p в определениях функций Common Lisp (подробности и дополнительные сведения см. в http://www.gigamonkeys.com/book/functions.html и http://www.psg.com/~dlamkins/sl/chapter21.html).

Ответы [ 2 ]

7 голосов
/ 05 октября 2011

Нет, вы не можете это знать напрямую.

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

private var usedDefault = false

private def default = {
  usedDefault = true
  1
}

def myMethod(x: Int = default) = {
  if (usedDefault) {
    println("default")
  } else {
    println("supplied")
  }
  usedDefault = false
}

Еще один более практичный способ это:

def myMethod(): Unit = myMethod(1, usedDefault = true)
def myMethod(x: Int): Unit = myMethod(x, usedDefault = false)

private def myMethod(x: Int, usedDefault: Boolean) = {
  if (usedDefault) {
    println("default")
  } else {
    println("supplied")
  }
}
1 голос
/ 05 октября 2011

Если у вас небольшое количество параметров, вы всегда можете перегрузить свои функции, так что

def myMethod(x: Int) = x + 1
def myMethod() = myMethod(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...