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