Banyak bahasa yang memilih rute untuk membuat penugasan sebuah pernyataan daripada ekspresi, termasuk Python:
foo = 42 # works
if foo = 42: print "hi" # dies
bar(foo = 42) # keyword arg
dan Golang:
var foo int
foo = 42 # works
if foo = 42 { fmt.Printn("hi") } # dies
Bahasa-bahasa lain tidak memiliki tugas, tetapi binding cakupan, misalnya OCaml:
let foo = 42 in
if foo = 42 then
print_string "hi"
Namun, itu let
adalah ekspresi itu sendiri.
Keuntungan dari mengizinkan penugasan adalah bahwa kita dapat secara langsung memeriksa nilai pengembalian suatu fungsi di dalam kondisional, misalnya dalam cuplikan Perl ini:
if (my $result = some_computation()) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
Perl juga menambahkan deklarasi ke kondisi itu saja, yang membuatnya sangat berguna. Ini juga akan memperingatkan jika Anda menetapkan di dalam kondisi tanpa menyatakan variabel baru di sana - if ($foo = $bar)
akan memperingatkan, if (my $foo = $bar)
tidak akan.
Membuat penugasan dalam pernyataan lain biasanya cukup, tetapi dapat membawa masalah pelingkupan
my $result = some_computation()
if ($result) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
# $result is still visible here - eek!
Golang sangat bergantung pada nilai kembali untuk pengecekan kesalahan. Oleh karena itu memungkinkan persyaratan mengambil pernyataan inisialisasi:
if result, err := some_computation(); err != nil {
fmt.Printf("Failed with %d", result)
}
fmt.Printf("We succeeded, and the result is %d\n", result)
Bahasa lain menggunakan sistem tipe untuk melarang ekspresi non-boolean di dalam sebuah kondisi:
int foo;
if (foo = bar()) // Java does not like this
Tentu saja itu gagal ketika menggunakan fungsi yang mengembalikan boolean.
Kami sekarang telah melihat mekanisme yang berbeda untuk bertahan terhadap penugasan yang tidak disengaja:
- Larang penugasan sebagai ungkapan
- Gunakan pengecekan tipe statis
- Tugas tidak ada, kami hanya memiliki
let
ikatan
- Izinkan pernyataan inisialisasi, abaikan penugasan sebaliknya
- Larang penugasan di dalam kondisi tanpa deklarasi
Saya telah memeringkatnya dalam urutan preferensi naik - tugas dalam ekspresi dapat berguna (dan mudah untuk menghindari masalah Python dengan memiliki sintaks deklarasi eksplisit, dan sintaks argumen bernama berbeda). Tapi tidak masalah untuk melarang mereka, karena ada banyak opsi lain untuk efek yang sama.
Kode bebas bug lebih penting daripada kode singkat.