Platinum Partner
java,scala,languages

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.

From http://www.markhneedham.com/blog/2011/06/12/scala-setting-a-default-value/

{{ tag }}, {{tag}},

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}
{{ parent.authors[0].realName || parent.author}}

{{ parent.authors[0].tagline || parent.tagline }}

{{ parent.views }} ViewsClicks
Tweet

{{parent.nComments}}