Oto przykład z książki, którą czytam:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Dlaczego potrzebuję wyrażeń złożonych? Mógłbym po prostu napisać volume = 10 * 20 * 30
lub volume = len * breadth * height
napisać funkcję dla tej lub anonimowej funkcji ...
Dlaczego używam begin
i end
? Lub prawdopodobnie lepsze pytanie: kiedy ich używam, jak sądzę, powyższy przykład z książki prawdopodobnie nie jest zbyt dobry.
Odpowiedzi:
Sądzę, że istnieje wiele sytuacji, w których
begin ... end
bloki są przydatne, ale jak zauważyłeś, często możesz również osiągnąć podobny efekt z innymi konstrukcjami, takimi jak funkcje itp.Do czego można
begin ... end
użyć bloków?len
,breadth
, iheight
będzie istnieć tylko w bloku i nie zanieczyszczają otaczające nazw.@inbounds begin <all my code without bounds checking goes here> end
lub owijanie@time begin ... end
fragmentu kodu.begin ... end
, nie wprowadza się zasięgu lokalnego, ale argument dotyczy podobnegolet ... end
bloku.)W szczególności drugi punkt dotyczy tego, do czego ich używam w swoich kodach.
źródło
begin
bloki czy nie wprowadzić zakres . Z drugiej strony konwertują sekwencję instrukcji na wyrażenie, co może być przydatne, jeśli generujesz kod za pomocą / z makra.let ... end
wprowadzeniem zakresu lokalnego. Poprawi moją odpowiedź.begin
bloki wprowadzają zasięg lokalny.Aby uogólnić to, co wszyscy inni powiedzieli: bloki pozwalają konwertować listę instrukcji (składniowe „frazy”, które nie mają wartości, tzn. Nie mogą być przypisane) na jedno wyrażenie („fraza”, która reprezentuje wartości i może być przypisana ).
Na przykład, chociaż nie powinieneś, możesz pisać
przypisać
x
do wyniku operacji zapętlenia. (Z zastrzeżeniem, że ostatnia instrukcja w sekwencji musi faktycznie być wyrażeniem - w przeciwnym razie wyrażenie nie miałoby żadnej wartości).Uzasadnionym przypadkiem użycia tego jest wygenerowany kod. Na przykład możesz się odwrócić
w
w sposób przejrzysty dla użytkownika, podczas gdy
@something
może swobodnie generować dowolne konstrukcje językowe.Lub jeśli chcesz napisać anonimową funkcję o dłuższym ciele (i nie używać
function
formularza):źródło
x = y = 1
,a = if false end
ib = for i in 1:2 end
, po którymx
ma wartość1
,a
ib
oba mają wartośćnothing
.if-else
oświadczeniem:a = if false; 1 else 2 end
. W tym przypadkua
jest równy2
.setproperty!
/setindex!
i „tradycyjnie” jest rzeczą, która ma wartość (w językach podobnych do C). To samoif-else
dotyczy wyrażenia w kilku językach. Alefor
iif
bezelse
konieczności „Domyślna” wartośćnothing
, widzę, że jedynie jako artefakt.Jednym z zastosowań tych bloków jest zrozumienie:
Możesz zrobić funkcję i użyć jej zamiast tego w zrozumieniu, ale czasami jest to wygodne. Jest używany, gdy chcesz gdzieś użyć wielowierszowego bloku kodu, np. Do przekazania jako argumentu do makra (co jest bardzo często używane
@testset
w standardowej bibliotece Test).źródło
y^2 - y^4 + 2
w tym przypadku. Być może lepiej byłoby pokazać przykład, w którym naprawdę potrzebne są dwa (lub więcej) kroków.Mówiąc prosto: „start” oznacza tylko blok kodu (patrz dokumentacja na ten temat: https://docs.julialang.org/en/v1/base/base/#begin ).
W powyższym przykładzie nie jest jasne, czy istnieje jakakolwiek wartość dla użycia bloku początkowego vs. deklarowania funkcji.
Nie widzę tego słowa kluczowego używanego w kodzie i osobiście nigdy go nie używałem w praktyce. Moja sugestia, aby po prostu użyć funkcji, ponieważ zrobi to samo.
źródło
progn
W LISP).