Как получить возвращаемое значение из блока if else

#scala #if-statement

#scala #if-оператор

Вопрос:

Я хочу определить значение, вызываемое Options с помощью функции Map. env это параметр аргумента, который может быть либо «dev», либо «prod». Я хочу иметь доступ к значению вне оператора if. Как я могу это исправить? Вот что у меня есть:

 val sfOptions = ""
    if (env == "prod") {
      val sfOptions = Map(
        "sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> "XXX",
        "sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX"
      )
    } else if (env == "dev") {
      val sfOptions = Map(
        "sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> "XXX",
        "sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX"
      )
    }
  

Ответ №1:

Вероятно, самый простой способ — присвоить значение sfOptions, используя результат выражения соответствия. В этом случае что-то вроде этого:

 val sfOptions = env match {
  case "prod" => Map(
        "sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> "XXX",
        "sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX"
      )
  case "dev" => Map(
        "sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> "XXX",
        "sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX"
      )
}
  

Редактировать: чтобы сделать это конкретно с помощью оператора if-else, взгляните на сообщение Рамана. Поскольку каждый оператор в Scala может возвращать значение, будь то match или if-else, вы можете использовать их напрямую с оператором присваивания.

Комментарии:

1. Это сработало! Спасибо! Имеет смысл. Не знал, что в этом случае я могу использовать выражение соответствия.

2. Ваш ответ правильный, но это может быть одним из способов сделать это, OP специально попросил сделать это из блока if else, пожалуйста, попробуйте обновить свой ответ и, пожалуйста, постарайтесь уточнить больше, чтобы OP мог понять концепцию, лежащую в основе, когда что использовать.

Ответ №2:

В дополнение к принятому ответу я хотел бы добавить некоторые сведения и концепцию, которые использует scala. Итак, прежде всего, в scala if и else являются функцией, а не выражением, следовательно if else , также возвращает значение, поэтому мы можем использовать if else что-то вроде этого.

 val result: Boolean = if (condition) 
   true 
else 
   false
  

Как мы можем видеть, соответствует ли условие, мы получим true в результате, в противном случае false .

В основном рекомендуется, чтобы для тривиального сопоставления мы использовали if, а else не сопоставление с шаблоном. В вашем случае мы можем использовать if и else .

 val sfOptions : Map[String, String] = if (env == "prod") {
    Map("sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> "XXX",
        "sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX")
    } else {
Map("sfURL" -> "XXX", "sfUser" -> "XXX", "sfRole" -> "XXX", "sfPassword" -> 
     "XXX","sfDatabase" -> "XXX", "sfSchema" -> "XXX", "sfWarehouse" -> "XXX")
    }
  

Вам нужно иметь в виду, что оба ваших блока условий возвращают один и тот же тип данных, Map[String, String] иначе вы получите возвращаемый тип как любой, и тогда вы не сможете использовать val sfOptions его по своему усмотрению.