Что дартс эквивалентно котлину? - PullRequest
0 голосов
/ 03 сентября 2018

Недавно я углубился в экосистему Flutter, и Dart зарекомендовал себя аккуратным и простым языком.

В настоящее время я ищу лучший способ запускать методы, если необязательная переменная не равна нулю.

Другими словами, я ищу в Dart что-то похожее на оператор let оператора Котлина :

variable?.let {
    doStuff();
    doABitMoreStuff();
    logStuff();
}

У кого-нибудь есть идеи или лучшие практики по этому поводу?

Я изучил документацию Дартса и не нашел ничего, что соответствовало бы моим требованиям.

С уважением,

Ответы [ 5 ]

0 голосов
/ 22 января 2019

Несмотря на то, что Дарт не имеет поведения, подобного let, как у Kotlin, но мы, безусловно, можем эмулировать его с помощью краткого и удобочитаемого кода. Может быть, что-то вроде этого:

void main() {
  String str = null;

  str?.isEmpty ?? Function.apply(() {
    print("Hey there you cheeky null valued variable");
  }, []);
}
0 голосов
/ 04 сентября 2018

Разница между x?.let{ } и if (x != null) { } в Котлине заключается в том, что первая способствует тому, что x не обнуляется. Поскольку у Kotlin есть типы, не допускающие значения NULL, вам не нужно писать x!!, чтобы утверждать, что NULL не может быть обнулен внутри блока.

Дарт не имеет необнуляемых типов (пока), так что различие в Дартсе не важно. Просто используйте if (x != null) { ... }. Если Dart получает ненулевые типы, вы можете быть уверены, что проверка null в условии также повысит x до ненулевого значения внутри блока (если x - локальная переменная, не мутируется внутри блока , могут применяться другие ограничения).

Судя по вашим другим комментариям, вы, возможно, захотите использовать поведение Котлина x?.run { ... }, которое связывает this с x внутри блока лямбды. В Dart нет соответствующей функции. Вы не можете переопределить this, он всегда привязан к объекту, к которому был вызван текущий метод, даже внутри вложенных замыканий, которые фиксируют значение this так же, как они захватывают другие переменные.

0 голосов
/ 03 сентября 2018

Эквивалентом дротика будет комбинация каскадного оператора и нулевой проверки:

MyClass foo;

if (foo != null) {
  foo
    ..doStuff()
    ..doABitMoreStuff()
    ..logStuff();
}

Вы можете создать свою собственную статическую функцию, хотя:

typedef T LetCallback<T>(T value);

T let<T>(T value, LetCallback<T> cb) {
  if (value != null) {
    return cb(value);
  }
}

Затем используется так:

let<MyClass>(foo, (it) {

})
0 голосов
/ 03 сентября 2018

Прямого эквивалента нет, потому что в Дартсе это не нужно. Дарт больше похож на Java, и вам часто приходится сталкиваться с похожими решениями.

В дротике почти нет синтаксического сахара. Это должно быть легко учиться.

Кроме того, Dart не применяет строгие проверки на ноль, все переменные имеют значение NULL, а язык является однопоточным. Вот почему нет необходимости в let. Используйте if вместо:

if(variable != null) {
  doStuff();
  doABitMoreStuff();
  logStuff();
}
0 голосов
/ 03 сентября 2018

Я думаю, закрытие делает то, что вы хотите

class Foo {
  var x = 42;
  void bar() {
    () {
      print(x);
      doStuff();
      doABitMoreStuff();
      logStuff();
    }();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...