2017-02-06 5 views
1

Я пытаюсь понять, как будущее работает, и я наткнулся на его apply(). Апи говорит это о apply()apply() возвращает тот же объект

Запуск асинхронного вычисления и возвращает Future объекта с результатом этого вычисления

Я хотел лучше понять его, создав простой объект, чей применить волю вернуть тот же объект с измененными полями. Например, рассмотрим следующий код:

object Rough extends App { 
    trait Sample 

    object Sample { 
    var x: Int = 0 
    def apply[T](body: => T): String= { 
     "Hello " + body 
    } 
    } 

    val s: String = Sample.apply("World") 

    print(s) 
} 

Сейчас применяется возвращается к String. Я хочу, чтобы он вернулся Sample[Int]. В частности, я хочу, чтобы apply() возвращал Sample[Int], где значением Int будет длина строковых символов, которая была передана в apply(). Как я могу это сделать?

ответ

1

Вы, кажется, путаетесь с несколькими несвязанными темами Scala.

Прежде всего, apply() - это всего лишь метод, подобный любому другому. Это только особенность в том, что имя может быть опущено при его вызове. Таким образом, Sample() является просто удобной стенографией для Sample.apply().

Теперь, если вы хотите метод, который возвращает объект singleton, к которому он присоединен, просто верните его this.

object Sample { // create a singleton object 
    var x: Int = 0 
    def apply(s: String): Sample.type = { 
    x = s.length // save some data 
    this   // return a reference to this object 
    } 
} 

val samp = Sample("Hi there") // invoke the 'apply()' method 
samp.x   // get the saved data --> res0: Int = 8 
+2

И еще одно, что «возвращает' Future' объект»(или«объект 'Sample'») не означает, что она возвращает «тот же объект», т.е. объекта, определенного объекта 'Future', но объект, который расширяет «черту Future [A]». –

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