Ini adalah contoh dari buku yang saya baca:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Mengapa saya perlu ekspresi majemuk ?? Saya hanya bisa menulis volume = 10 * 20 * 30
atau volume = len * breadth * height
menulis fungsi untuk itu atau fungsi anonim ...
Mengapa saya menggunakan begin
dan end
? Atau pertanyaan yang mungkin lebih baik: Kapan saya menggunakannya, karena saya kira contoh di atas dari buku mungkin tidak terlalu baik.
Jawaban:
Saya kira ada banyak situasi di mana
begin ... end
blok berguna, tetapi seperti yang Anda catat Anda sering dapat juga mencapai efek yang sama dengan konstruksi lainnya, seperti fungsi, dll.Untuk apa
begin ... end
blok bisa digunakan?len
,breadth
, danheight
hanya akan ada di dalam blok dan tidak mencemari namespace sekitarnya.@inbounds begin <all my code without bounds checking goes here> end
atau membungkus@time begin ... end
sepotong kode.begin ... end
tidak tidak memperkenalkan lingkup lokal, tetapi argumen berlaku untuk samalet ... end
blok.)Secara khusus poin kedua adalah apa yang saya gunakan dalam kode saya.
sumber
begin
blok jangan tidak memperkenalkan lingkup . Di sisi lain, mereka mengubah urutan pernyataan menjadi ekspresi, yang dapat berguna jika Anda membuat kode dengan / dari makro.let ... end
yang memperkenalkan lingkup lokal. Akan memperbaiki jawaban saya.begin
blok memperkenalkan ruang lingkup lokal.Untuk menggeneralisasi apa yang dikatakan orang lain: blok memungkinkan Anda mengonversi daftar pernyataan ("frasa" sintaksis yang tidak memiliki nilai, yaitu, tidak dapat ditetapkan) menjadi satu ekspresi ("frasa" yang mewakili nilai dan dapat ditugaskan ).
Misalnya, walaupun tidak seharusnya, Anda dapat menulis
untuk menetapkan
x
hasil operasi looping. (Dengan batasan bahwa pernyataan terakhir dalam urutan harus benar-benar ekspresi - jika tidak, Anda tidak akan memiliki nilai untuk ekspresi.)Kasus penggunaan yang sah dari ini dihasilkan kode. Misalnya, Anda mungkin berbalik
ke
secara transparan kepada pengguna, sementara
@something
dapat dengan bebas menghasilkan konstruksi bahasa apa pun.Atau jika Anda ingin menulis fungsi anonim dengan tubuh yang lebih panjang (dan tidak menggunakan
function
formulir):sumber
x = y = 1
,,a = if false end
danb = for i in 1:2 end
, setelah itux
memiliki nilai1
, dana
danb
keduanya memiliki nilainothing
.if-else
pernyataan:a = if false; 1 else 2 end
. Dalam hal ini,a
sama dengan2
.setproperty!
/setindex!
, dan "secara tradisional" adalah sesuatu yang memiliki nilai (dalam bahasa seperti-C). Sama untukif-else
, yang merupakan ekspresi dalam beberapa bahasa. Tetapifor
danif
tanpaelse
memiliki nilai "standar"nothing
, saya melihat itu hanya sebagai artefak.Satu kegunaan untuk blok ini adalah dalam pemahaman:
Anda bisa membuat fungsi dan menggunakannya di dalam pemahaman sebagai gantinya, tetapi kadang-kadang ini nyaman. Ini digunakan kapan pun Anda ingin menggunakan blok kode multiline di suatu tempat, misalnya untuk meneruskan sebagai argumen ke makro (yang sangat umum digunakan untuk
@testset
dari pustaka standar Test).sumber
y^2 - y^4 + 2
dalam kasus ini Mungkin akan lebih baik untuk menunjukkan contoh di mana dua (atau lebih) langkah sangat dibutuhkan.Sederhananya: "mulai" hanya menunjukkan blok kode (lihat dokumen tentang ini: https://docs.julialang.org/en/v1/base/base/#begin ).
Dalam contoh di atas, tidak jelas bahwa ada nilai untuk menggunakan blok awal vs mendeklarasikan fungsi.
Saya tidak melihat kata kunci yang digunakan sangat banyak dalam kode dan saya pribadi tidak pernah menggunakannya dalam praktik. Saran saya agar hanya menggunakan fungsi karena akan melakukan hal yang sama.
sumber
progn
Dalam LISP).