Понимание стандартного сообщения аргумента Scala - PullRequest
0 голосов
/ 22 ноября 2018

Я играю с кодом Scala и получил сообщение об ошибке, за которым я не совсем понимаю.Ниже приведен мой код

val ignoredIds = Array("one", "two", "three")


def csNotify(x : Any): String = {

  case org: String if !ignoredIds.contains(x) =>
    println( s" $x  should not be here")
    "one"
  case org : String if ignoredIds.contains(x) =>
    println(s"$x should be here")
    "two"
}

csNotify("four")

Вывод консоли состоит в том, что аргументы для функции по умолчанию должны быть известны.Кажется, точка ошибки указывает на «String =».Почему это так?Функция должна проверить два случая и вернуть строку?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Ответ Амит Прасад уже показывает, как это исправить, но для объяснения сообщения об ошибке:

{

  case org: String if !ignoredIds.contains(x) =>
    println( s" $x  should not be here")
    "one"
  case org : String if ignoredIds.contains(x) =>
    println(s"$x should be here")
    "two"
}

сам по себе (без ... match перед ним) анонимная функция сопоставления с образцом, который может использоваться только тогда, когда компилятор знает тип аргумента из контекста, то есть ожидаемый тип должен быть либо PartialFunction[Something, SomethingElse], либо типом с одним абстрактным методом (включая Something => SomethingElse).

Здесь ожидаемый тип - String, что не относится ни к одному из них, поэтому компилятор жалуется, что не знает, какой тип аргумента.

0 голосов
/ 22 ноября 2018

Вам нужно использовать ключевое слово match, чтобы использовать варианты.Там может быть какое-то значение, для которого вы будете использовать сопоставление с образцом.Поэтому используйте следующий код в вашей функции:

x  match {
  case org: String if !ignoredIds.contains(x) => ???
  case org : String if ignoredIds.contains(x) => ???
}

Также вам следует рассмотреть возможность добавления еще одного регистра, который является значением по умолчанию.Как вы знаете, параметр x вашей функции def csNotify(x: Any): String имеет тип any.Таким образом, все, кроме String, также может быть передано здесь, например Int или Boolean или любой другой тип.В этом случае код прервется с ошибкой совпадения.

Также будет предупреждение компилятора о match is not exhaustive, поскольку текущий код не обрабатывает все возможные значения для типа Any параметра x.

Но если вы добавите один случай по умолчанию в сопоставление с образцом, все случаи, которые не обрабатываются первыми двумя случаями (неожиданный тип или значения), перейдут к случаю по умолчанию.Таким образом, код будет более надежным:

def csNotify(x : Any): String =  x  match {
  case org: String if !ignoredIds.contains(org) => ???
  case org : String if ignoredIds.contains(org) => ???
  case org => s"unwanted value: $org" // or any default value
}

Примечание. Пожалуйста, замените ??? на нужный код.:)

0 голосов
/ 22 ноября 2018

В вашем случае не найдено совпадение, по которому он может проверить ваш блок, и вы пропустили блок совпадений:

val ignoredIds = Array("one", "two", "three")


def csNotify(x : Any): String =  x  match {

 case org: String if !ignoredIds.contains(x) =>
println( s" $x  should not be here")
"one"
 case org : String if ignoredIds.contains(x) =>
println(s"$x should be here")
"two"
}

csNotify("four")

Таким образом, в основном, когда вы передаете x в метод, вы должны датьэто для матча, а также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...