· scala

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.

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket