Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
val log: Log = new Logger()
val log = new Logger() ) и прямо на нем вызывают методы из Log.LoggerToLogAdapter, то его экземпляр не будет создан вообще, даже для вызова его методов.В добавок, case-классы являются валидными классами, а значит с ними можно работать как с обычными классами (например, наследоваться от них).
Option покажу как его в данном случае будет использовать любой, кто пишет на scala больше недели:for (sound <- SoundSource.getSound) {
sound.play()
}
// аналогично
SoundSource.getSound.map{ _.play }
// аналогично SoundSource.getSound.map{ _.play }
SoundSource.getSound.foreach(_.play)
Unitов строить)foreach для Iterable просто перебирает итератор, как обычный джавовский цикл for. map же в обязательном порядке создаёт коллекцию — он принимает неявным аргументом CanBuildFrom, который используется для конструирования той же коллекции, как та, на которой map вызван.for (sound <- SoundSource.getSound) { // Справа налево. SoundSource.getSound - начало выражения, sound - конец
sound.play() // Слева направо
}
SoundSource.getSound.foreach(sound => sound.play() ) // всё слево направо
SoundSource.getSound.foreach(_.play() )
for (sound <- SoundSource.getSound) {
sound.play()
}
// аналогично
SoundSource.getSound.map{ _.play }
map и for не сработают, если там None.someOpt.fold(defaultValue) {smthn => smthnWithSameTypeAsDefaultValue}
None ничего делать не надо.fold не люблю. Предпочитаю map + getOrElse. Читается лучше.fold более кратокOption или нет.play, пусть и пустой, но вызов происходит. может я завтра туда запихну заглушку какую или логгер.trait Buffering extends OutputStream {
def bufferSize: Int
abstract override def write(b: Byte) {
// ... buffer for bufferSize bytes
super.write(b)
}
}
new FileOutputStream("foo.txt") with Buffering { val bufferSize = 12 }
Классические паттерны проектирования на Scala