Получение результата метода Future < T > флаттер

Я думаю, что стоит объяснить их использование в вызовах функций и почему происходят разные вещи. Поскольку кто-то уже сказал, что фигурные скобки определяют блок кода, который также является выражением, поэтому можно поставить выражение, в котором ожидается выражение, и оно будет оценено. Когда оценивается, его операторы выполняются, а значение последнего оператора - результат оценки целочисленного блока (несколько как в Ruby).

Имея это, мы можем делать такие вещи, как:

2 + { 3 }             // res: Int = 5
val x = { 4 }         // res: x: Int = 4
List({1},{2},{3})     // res: List[Int] = List(1,2,3)

Последний пример - это просто вызов функции с тремя параметрами, каждый из которых сначала оценивается.

Теперь, чтобы увидеть, как он работает с вызовами функций, давайте определим простую функцию, которая возьмет другую функцию в качестве параметра.

def foo(f: Int => Unit) = { println("Entering foo"); f(4) }

Чтобы вызвать ее, нам нужно передать функцию, которая принимает один param из типа Int, поэтому мы можем использовать функциональный литерал и передать его foo:

foo( x => println(x) )

Теперь, как сказано ранее, мы можем использовать блок кода вместо выражения, поэтому давайте использовать его

foo({ x => println(x) })

Что здесь происходит, так это то, что код внутри {} оценивается, а значение функции возвращается как значение оценки блока, это значение затем передается в foo. Это семантически то же самое, что и предыдущий вызов.

Но мы можем добавить что-то еще:

foo({ println("Hey"); x => println(x) })

Теперь наш блок кода содержит два оператора и потому, что он вычисляется до выполнения foo , происходит то, что сначала печатается «Эй», затем наша функция передается в foo, «Ввод foo» печатается и, наконец, печатается «4».

Это выглядит немного уродливым, хотя Scala позволяет мы должны пропустить скобку в этом случае, поэтому мы можем написать:

foo { println("Hey"); x => println(x) }

или

foo { x => println(x) }

Это выглядит намного приятнее и эквивалентно предыдущим. Здесь сначала вычисляется блок кода, и результат оценки (который является x => println (x)) передается как аргумент для foo.

1
задан hromer 7 March 2019 в 01:46
поделиться