Разница между подчеркиванием (_) и тройным знаком вопроса (???) в 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 это подтип любого данного типа, это работает.

Другие вопросы по тегам