Именованые аргументы и аргументы по умолчанию
Программисты на некоторых других языках могут смеяться сколько угодно, но в Scala к версии 2.8 появились именованные аргументы и аргументы со значениями по умолчанию.
Именованные аргументы
Здесь все очень просто: теперь, передавая значения в метод, можно указывать их не по порядку, а обращаться используя имена аргументов.
scala> case class NamedArgs(a:Int, b:Double, c:String) defined class NamedArgs scala> val x = NamedArgs(c = "foo", a = 2, b = 3.14) x: NamedArgs = NamedArgs(2,3.14,foo)
Значения по умолчанию
Более того, для отдельных аргументов можно указать значения по умолчанию, которые они будут принимать, если при вызове метода эти аргументы были опущены.
scala> case class DefaultVals(a:Int = 42, b:Double, c:String = "foo") defined class DefaultVals scala> val x = DefaultVals(b = 3.14) x: DefaultVals = DefaultVals(42,3.14,foo) scala> val y = DefaultVals(b = 3.14, c = "bar") y: DefaultVals = DefaultVals(42,3.14,bar)
Причем в отличие от, например, C++ порядок аргументов со значениями по умолчанию неважен.
Builder'ы
Теперь от них можно вообще отказаться, заменив комбинацией именованных аргументов и аргументов со значениями по умолчанию. Например, класс NutritionFacts из главы 2 книги Effective Java можно переделать в
case class NutritionFacts (
val servingSize:Int,
val servings:Int,
val calories:Int,
val fat:Int,
val sodium:Int,
val carbohydrate:Int)И тогда код на Java для конструирования объекта
NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).
calories(100).
sodium(35).
carbohydrate(27).
build();станет на Scala 2.8 таким:
NutritionFacts cocaCola = NutritionFacts(240, 8,
calories = 100, sodium = 35, carbohydrate = 27)Как видите, создание самого объекта cocaCola практически ничем не
отличается, тут уже дело вкуса, но зато целую страницу кода на Java мы
заменили, по сути дела, одной строкой на Scala.