Любая причина наличия val capacity : Int вместо val Int Capacity в Scala

Я читаю Scala и мне интересно...
Почему

val capacity : Int 

вместо

val Int capacity.

Любая причина, по которой был сделан этот выбор. Если нет, мне не кажется хорошим выбором отойти от способа объявления Java. Упростил бы переход с Java на Scala (ненамного, но немного)


person user855    schedule 12.12.2009    source источник


Ответы (6)


Потому что в большинстве случаев вы можете опустить часть Int. В Scala гораздо более аккуратная система вывода типов, чем в Java.

person Wysawyg    schedule 12.12.2009
comment
Если вы добавите пример с типом и без него, причина станет более очевидной. - person Daniel C. Sobral; 12.12.2009
comment
Зависит от. Иногда, когда правильный сайт сложен (особенно при создании API), вы должны аннотировать типы, так как это выявляет много ошибок во время компиляции. - person Raphael; 17.03.2011

По-моему, я где-то читал заявление самого Мартина Одерски о том, что это решение тоже было принято для того, чтобы улучшить читабельность. Это, безусловно, так, например. сравнивать

val Double number = ...
val Array[(Seq[String], Map[Seq[String], Double])] something = ...
val String pattern = ...

с участием

val number : Double = ...
val something : Array[(Seq[String], Map[Seq[String], Double])] = ...
val pattern : String = ...

В большинстве случаев вам нужно быстро (визуально) найти имена ссылок/матодов, а не типов.

person Raphael    schedule 17.03.2011

x : T — стандартное обозначение типов в логике и многих языках программирования. C и его потомки, в том числе Java, отклоняются от этого. Но обозначение типов C действительно ужасно (попробуйте записать тип для какой-нибудь умеренно сложной функции высшего порядка, такой как map).

Кроме того, с помощью этой нотации легко опустить тип (как уже написал Wysawyg) или добавить тип внутри выражения.

person starblue    schedule 12.12.2009

В Programming in Scala говорится, что техническая причина такого синтаксиса заключается в том, что он упрощает вывод типов.

person Fabian Steeg    schedule 13.12.2009
comment
Как размещение типов упрощает вывод типов? Вы можете конвертировать оба в один и тот же AST. - person Raphael; 17.03.2011

Вот пример заявления Wysawyg:

val capacity = 2

Но обычно вы не можете сделать это только с val.

trait Foo {
  def capacity = 2 // Allow child classes to override and decide the value later
}

// Force instances of Bar to set the value
class Bar( override val capacity : Int ) extends Foo

// Have Bat determine it on the fly
trait Bat extends Foo {
    def onlyAThird : Int
    override def capacity = onlyAThird * 3
}

(Я пытался вставить это как комментарий, но, увы, без форматирования.)

person Tristan Juricek    schedule 13.12.2009
comment
Почему вы используете def для буквальной константы? Далее: def здесь, кстати, кажется, объясняется как default. - person user unknown; 17.03.2011
comment
Ах, def о времени оценки. Если бы мы сказали val capacity = 2, вы не могли бы позволить Bat расширить Foo с помощью функции, которая определяет емкость на лету. - person Tristan Juricek; 18.03.2011
comment
Кажется, теперь я понимаю. Вы просто определяете его как def, чтобы сделать его переопределяемым методом. Значение val может быть переопределено только другим значением. - person user unknown; 18.03.2011

Я думаю, Даниэль подумал о чем-то вроде этого:

val a = 7
val b: Int = 8 

var x = "Foo"
var y: String = "Bar" 

def sum (a: Int, b: Int) = a + b
def mul (a: Int, b: Int): Int = a * b

Часто можно определить тип.

person user unknown    schedule 17.03.2011