2015-06-21 2 views
1

Я изучаю Scala из книги «Скала для нетерпимого». Один из разделов в книге иллюстрирует «свободно» стиль программирования с помощью следующего фрагмента кода:Scala «бегло» программирование стиля

object Title 

class Document { 
    private var useNextArgAs: Any = null 
    def set(obj: Title.type): this.type = { useNextArgAs = obj; this } 
    def to(arg: String) = if (useNextArgAs == Title) title = arg; else ... 
} 

Затем автор делает метод следующий вызов:

book set Title to "Scala for the Impatient" 

Некоторые вопросы здесь:

  1. Почему useNextArgAs тип Any? Единственным типом, который используется в примере для useNextArgAs, является Title. Можете ли вы показать пример использования для использования Any вместо Title?
  2. Метод set возвращает this, но тип возврата this.type, а не Document? Разве это не this?
  3. В способе to, title = arg относится к несуществующим var title? Откуда это?
+2

Книга ориентирована на Scala и показывает такой пример с изменяемыми типами 'var' и' Any' без предупреждения? – cchantep

+0

@cchantep "for the Impatient" - это ключ :) Из обзоров amazon 'Java-программист после прочтения этой книги будет писать пишу в стиле java программирования. Мы этого не хотим. Нам нужны разработчики, которые могут мыслить и программировать на scala way.' – harshtuna

+0

Я не согласен с тем, кто написал этот отзыв. У меня 3 книги на Scala, «Scala for the Impatient», «Learning Scala» и «Programming in Scala» и IMHO, «Нетерпеливое ...» - лучшая из них. Он имеет необходимую глубину, но не дает вам спать. Возможно, рецензент не работал над упражнениями, и именно там они пропустили это. Упражнения так же важны, как и уроки, потому что каждый вопрос заставляет вас думать. Я вижу, что «путь scala» слишком сильно рекламируется слишком многими людьми без объяснения того, что для них значит, если вообще что-то. Отказ от ответственности: мне не заплатил автор. –

ответ

1

Возможная (не совсем правильно) реализацию для этого упражнения из книги можно найти (Spoiler Alert!) в github

В главе 18, где этот пример взят из помечен как «старшего Lib Дизайнер ". На этом уровне человек должен быть хорошо осведомлен о проблемах повторного использования и расширяемости, а также о последствиях изменчивого состояния в scala. Это, конечно, не техничность для новичков.

На вопросы Op по:

1) Почему useNextArgAs типа Любой? --- чтобы он поддерживал произвольные типы атрибутов в подклассах Document. Document не объявлен final

2) Метод set возвращает это, но тип возврата - это.тип --- см статью Элвина Александра ниже (вы, вероятно, объяснение в «Scala для нетерпеливых»)

явно устанавливая this.type в качестве возвращаемого типа вашего набора * Методы гарантирует, что беглый стиль будет продолжать работать в ваших подклассах

рассмотрит следующее расширение и поиграйте с set() и to() типа возвращаемого значения и

class Book extends Document { 
    def bind :this.type = {/*do something*/; this} 
} 

val book = new Book 
(book set Title to "Scala for the Impatient").bind 

3) несуществующим вар название --- это изменчивое поле в документе, просто отсутствует в фрагменте кода при условии

Некоторые дополнительные чтения по теме:

+0

2) Позвольте мне задать вопрос по-другому. Я понимаю причину возврата типа 'this.type', что также объясняется в книге. Я спрашивал, что тип возвращаемого значения указывается как 'this.type', а' this' возвращается. Я ожидал, что вместо этого будет возвращен 'this.type'. –

+0

вам нужно вернуть 'this' для цепочки, но вы не можете использовать только' this' как тип. если вы жестко задаете тип конкретному классу (в данном случае - «Документ») или дайте компилятору вывести его (в этом случае «Документ») - вы не сможете подключать методы к подклассам без явного придания типов. поэтому 'this.type' является единственным рабочим вариантом. – harshtuna

Смежные вопросы