У меня есть функция, которой нужно передать длинное значение. В качестве примера блока кода ниже:
val expectTime = sys.env.getOrElse("envVar", "1000").toLong
pause(expectTime.milliseconds)
Когда я попытаюсь скомпилировать это, оно вернет это value milliseconds is not a member of Long
, хотя я могу запустить этот код:
java.long.getLong("var", 1000L)
pause(expectTime.milliseconds)
Немного покопавшись, я увидел, что getOrElse вернет Option[String], но я не уверен, что пошло не так с моим преобразованием, которое привело к тому, что функция «не приняла» там длинное значение. Есть ли способ для этого?
Кроме того, кстати, вместо того, чтобы getOrElse
использовать значение String
для последующего анализа его как Long
, я бы лично сделал это: val expectTime = sys.env.get(key = "envVar").flatMap(_.toLongOption).getOrElse(default = 1000L)
- Это также позволяет избежать небезопасных toLong
.
Спасибо @LuisMiguelMejíaSuárez, это работает, не могли бы вы дать мне поток этой переменной?
@TriNguyen Что вы подразумеваете под «потоком» переменной?
@LuisMiguelMejíaSuárez, извините, я новичок в Scala, я имею в виду, что из вашего кода я понимаю, что тип значения возвращается сначала как Option, а затем как Option[Long], верно?
@TriNguyen, ох, честно, да, позвольте мне ответить со всеми подробностями.
Прежде всего, как упомянул Гаэль, основная проблема, вероятно, заключается в отсутствии импорта, например: scala.concurrent.duration._
, позволяющего конвертировать.
Во-вторых, мы можем улучшить способ получения значения Env
, чтобы сделать его более безопасным и избежать анализа постоянных значений.
val expectTime =
sys
.env
.get(key = "envVar")
.flatMap(_.toLongOption)
.getOrElse(default = 1000L)
Это безопаснее, потому что, если значение внутри envVar
не является числом, оно не вызовет исключение, а просто вернется к значению по умолчанию. Кроме того, в случае возврата к значению по умолчанию мы можем просто использовать литерал Long
.
Давайте разберем код шаг за шагом, чтобы его было легче читать.
sys // This is the system object the stdlib provides.
.env // We access the environment from the system, its type is a Map[String, String]
.get(key = "envVar") // We try to get the env var called 'envVar', this returns an Option[String]
.flatMap(_.toLongOption) // We then transform that Option[String] into an Option[Long] by trying to parse the value (if it exists) as a Long.
.getOrElse(default = 1000L) // Finally, we either get the value inside the Option if any, or we return a default value. Meaning the result is a plain Long.
Я сомневаюсь, что
getOrElse
дает вамOption
.get
хотя бы. Я думаю, что ваша проблема скорее в недостающем утвержденииimport scala.concurrent.duration._
(или что-то в этом роде, я не уверен на 100%).