Scala: Setting a default value
We wanted to try and generate a build label to use for the name of the artifacts archive that gets generated each time we run the build but wanted to default it to a hard coded value if the system property representing the build label wasn’t available.
In Ruby we would be able to do something like this:
buildLabel = ENV["GO_PIPELINE_LABEL"] || "LOCAL"
There isn’t a function in Scala that does that so we initially ended up with this:
def buildLabel() = [{
System.getenv("GO_PIPELINE_LABEL") match {
case null => "LOCAL"
case label => label
}
}
My colleague Mushtaq suggested passing the initial value into an Option like so…
def buildLabel() = {
Option(System.getenv("GO_PIPELINE_LABEL")).getOrElse("LOCAL")
}
…which I think is pretty neat!
I tried to see what the definition of an operator to do it the Ruby way would look like and ended up with the following:
class RichAny[A](value:A ) {
def || (default:A ) = { Option(value).getOrElse(default) }
}
implicit def any2RichAny[A <: AnyRef](x: A) = new RichAny(x)
Which we can use like so:
def buildLabel() = {
System.getenv("GO_PIPELINE_LABEL") || "LABEL"
}
I imagine that’s probably not the idiomatic Scala way to do it so I’d be curious to know what is.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.