Разница между подчеркиванием (_) и тройным знаком вопроса (???) в scala
Я нахожусь в процессе написания некоторого кода, поэтому я хотел оставить нереализованный метод, который я вызываю, но этот путь не зависит от вводимых данных. Метод выглядит так
object HbaseStore {
def get() = _
}
Но приведенный выше код бросил исключение
HbaseStore.scala:24: ошибка: параметр несвязанного заполнителя
[INFO] def get() = _
Но когда я заменил _
с ???
код успешно выполнен Мне просто любопытно узнать, в чем разница между этими двумя. Насколько я знаю, _
предоставляет значения по умолчанию, поэтому я предположил, что это определит пустую функцию здесь и вернет Nothing
,
2 ответа
_
является синтаксисом-заполнителем, который используется для привязки значений. Синтаксис заполнителя используется во многих сценариях, например: В случае списка:
val x = List(1,2,3,4,5)
//To print each value we can do:
x.map(res => println(res))
//Now, we can use placeholder syntax to bind res value.
x.map(println(_))
Сопоставление с образцом:
val x = "some value"
x match {
case x:String => //convert to lowercase and print.
case res@_ => //here, type doesnot matter I just want to get that value and print as it is. println(res)
Итак, в основном, вы используете синтаксис заполнителя, если хотите получить значение, не зная его типа.
С другой стороны, ???
присваивается методу или переменным в качестве значения в случае, если вы не хотите предоставлять реализацию.
например def doSomething() => ???
Вот, doSomething()
Метод не реализован, и вам необходимо предоставить или переопределить реализацию позже. Обратите внимание, что вы не можете использовать переменные / методы без реализаций, и вы получите исключение в случае, если вы попытаетесь вызвать его. например doSomething()
потерпит неудачу в вышеуказанном случае.
Если вы хотите использовать _
в качестве значения по умолчанию необходимо указать тип этого значения. Например var x: Any = _
будет инициализирован с null
но var x: Int = _
будет инициализирован с 0
, относительно ???
: Вы можете нажать на определение ???
в IDE:
def ??? : Nothing = throw new NotImplementedError
поскольку Nothing
это подтип любого данного типа, это работает.