Pertanyaan Logika Boolean di Masa Depan [Boolean]


Dalam pemrograman non-konkuren, kita biasanya memiliki logika boolean seperti ini:

boolean canIMarryher(){
    return iLoveHer() && myParentsLoveHer() && shesHot() && sheSaidYes();
}

Inilah pertanyaan saya, bagaimana jika semua ini (atau beberapa kondisi ini) adalah Future [Boolean] dalam scala? Apakah saya masih bisa mendapatkan metode yang jelas seperti contoh di atas?

Memperbarui Seperti yang Anda ketahui, dalam logika boolean pada saat run time kita akan memiliki 'optimasi' seperti: segera kembali saat menggunakan && dan bertemu a false atau menggunakan || dan bertemu a true. Bisakah saya memilikinya di Future [Boolean] juga?

Salam, Drew


4
2017-09-05 15:33


asal


Jawaban:


Jawaban yang lain dengan pemahaman-dan mengurangi tidak akan "hubungan pendek." Artinya, jika masa depan pertama membutuhkan waktu beberapa saat untuk selesai, kita akan menunggu sepanjang waktu itu bahkan jika masa depan kedua mengevaluasi false segera.

Untuk memperjelas, ini berbeda dari hubungan arus pendek dalam logika boolean tradisional di mana kami mengevaluasi sisi kanan operator dengan-nama. Sebaliknya, tujuannya adalah menghasilkan jawaban secepat mungkin. Kami memulai setiap perhitungan masa depan dengan segera, dan membuat hubungan singkat jika memungkinkan karena hasilnya masuk. Dalam kasus terbaik, kami hanya harus menunggu masa depan tercepat, dan dalam kasus terburuk, kami harus menunggu masa depan yang paling lambat.

Berikut adalah metode yang mendukung jenis hubungan arus pendek ini:

def all(futures: Future[Boolean]*)(implicit executor: ExecutionContext): Future[Boolean] = {
  Future.find(futures) { !_ } map { _.isEmpty }
}

def canIMarryher = all(iLoveHer, myParentsLoveHer, shesHot, sheSaidYes)

Jika Anda benar-benar ingin, Anda dapat mengambil ide lebih lanjut dan menentukan && dan || metode untuk Future[Boolean]


8
2017-09-05 16:56



Seperti kata matematika, Future.reduce baik jika Anda dapat melihat mereka sebagai urutan nilai, jika Anda perlu lebih banyak makna untuk masing-masing dari mereka, Anda dapat menggunakan untuk pemahaman:

val isThereAFuture: Future[Boolean] = 
  for {
    iLoveHer <- doILoveHer()
    myParentsLoveHer <- doMyParentsLoveHer()
    sheLovesMe <- doesSheLoveMe()
  } yield iLoveHer && myParentsLoveHer && sheLovesMe

4
2017-09-05 15:53