Cara membaca variabel lingkungan di Scala

158

Di Jawa, variabel lingkungan membaca dilakukan dengan System.getenv().

Apakah ada cara untuk melakukan ini di Scala?

summerbulb
sumber

Jawaban:

232

Karena Scala 2.9 Anda dapat menggunakan sys.envuntuk efek yang sama:

scala> sys.env("HOME")
res0: String = /home/paradigmatic

Saya pikir lebih baik menggunakan Scala API daripada Java. Saat ini ada beberapa proyek untuk mengkompilasi Scala ke platform lain selain JVM (.NET, javascript, asli, dll.) Mengurangi dependensi pada Java API, akan membuat kode Anda lebih portabel.

paradigmatik
sumber
96
Ini mungkin praktik yang lebih baik untuk digunakan sys.env.get("VARIABLE")yang akan memberi Anda Option[String]daripada melemparkan kesalahan jika variabel itu hilang.
Cristian Vrabie
4
@ ChristianVrabie Saya lebih suka juga, dalam banyak kasus. Tapi sys.envhanya a Map. Anda dapat menggunakan metode apa pun yang sesuai untuk Anda.
paradigmatik
3
sys.env.getOrElse("VARIABLE", "default value")juga membantu dalam kasus saya di mana variabel lingkungan mungkin tidak didefinisikan.
Josh Peak
131

Ada sebuah objek:

scala.util.Properties

ini memiliki kumpulan metode yang dapat digunakan untuk mendapatkan info lingkungan, termasuk

scala.util.Properties.envOrElse("HOME", "/myhome" )
andy
sumber
3
Saya juga lebih suka Properti. Ini memungkinkan untuk mengambil Opsional, dan memiliki nama untuk properti yang umum digunakan.
ppopoff
25

Cara yang sama:

scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg
dhg
sumber
Sekarang saya menggunakan Scala setiap hari, saya harus memindahkan jawaban yang diterima ke jawaban @ paradigmatic. Ini menggunakan Scala API dan jika digunakan seperti yang disarankan dalam komentar dapat mengembalikan Opsi.
summerbulb
11

Menggunakan langsung default dengan getOrElselebih dari sys.envPeta ( val myenv: Map[String, String] = sys.env):

sys.env.getOrElse(envVariable, defaultValue)

Anda mendapatkan konten envVariableatau, jika tidak ada defaultValue,.

menang
sumber
0

Untuk mencetak semua variabel lingkungan, Anda dapat menggunakan

System.getenv.forEach((name, value) => println(s"$name: $value"))
Matthias Braun
sumber
1
error: missing parameter typepada args jika Anda hanya menyalin-menempelkan ini.
thundergolfer
@ thundergolfer: Saat ini saya belum menginstal Scala di komputer saya. Apakah Anda mengetahui apa yang hilang?
Matthias Braun
Setelah mengubah parameter ke (name: String, value: String), saya mengerti error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String].
Roland Weber
1
Ini adalah sesuatu yang berfungsi, tetapi memerlukan impor: alvinalexander.com/scala/…
Roland Weber