Есть ли родной (поддерживаемый языком) ленивый синтаксис оценки? Что-то вроде lazy val
в Скале.Как сделать ленивую оценку в Dart?
Я прошел через the docs и ничего не нашел. Существует только глава о «ленивой загрузке библиотеки», но я не об этом спрашиваю.
Основываясь на этом исследовании, я склонен верить (пожалуйста, поправьте меня, если я ошибаюсь), что в настоящее время такой вещи нет. Но, может быть, вы знаете какие-либо планы или запросы функций, которые будут обеспечивать функциональность? Или, возможно, это было рассмотрено и отклонено командой Дарта?
Если на самом деле нет никакой поддержки для этого, тогда какая наилучшая практика (лучший синтаксис) для реализации ленивой оценки? Примером может служить оценка.
Edit:
Преимущества функции, которые я искал в основном те же, что и в реализации на других языках: Scala's lazy val
или C#'s Lazy<T>
или Hack's __Memorize attribute:
- кратким синтаксис
- отложенное вычисление до тех пор, пока не потребуется значение
- кэш-результат (по запросу лень)
- не нарушают чисто функциональной парадигмы (объяснение ниже)
Простой пример:
class Fibonacci {
final int n;
int _res = null;
int get result {
if (null == _res) {
_res = _compute(this.n);
}
return _res;
}
Fibonacci(this.n);
int _compute(n) {
// ...
}
}
main(List<String> args) async {
print(new Fibonacci(5).result);
print(new Fibonacci(9).result);
}
Поглотитель очень многословным и имеет повторяющийся код. Кроме того, я не могу сделать конструктор const
, потому что переменная кэширования _res
должна быть вычислена по требованию. Я предполагаю, что если бы у меня была Scala-подобная функция lazy
, то у меня также была бы поддержка языка для создания постоянного конструктора. Это связано с тем, что ленивый оцененный _res
- referentially transparent и would not be in the way.
class Fibonacci {
final int n;
int lazy result => _compute(this.n);
const Fibonacci(this.n); // notice the `const`
int _compute(n) {
// ...
}
}
main(List<String> args) async {
// now these makes more sense:
print(const Fibonacci(5).result);
print(const Fibonacci(9).result);
}
Может йо u, пожалуйста, укажите конкретный пример того, чего вы хотите добиться, используя ленивую оценку. Насколько мне известно, нет специальной поддержки языка и не обсуждается. Многие методы в List, Map, ... которые ленивы оцениваются. Например, 'map()', 'fold()', 'reduce()', ... См. Например http://stackoverflow.com/questions/20491777/dart-fold-vs-reduce. Возможно, закрытие делает то, что вы хотите. –