Dies ist ein Beispiel aus einem Buch, das ich lese:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Warum brauche ich zusammengesetzte Ausdrücke? Ich könnte einfach eine Funktion für diese oder eine anonyme Funktion schreiben volume = 10 * 20 * 30
oder volume = len * breadth * height
schreiben ...
Warum benutze ich begin
und end
? Oder die wahrscheinlich bessere Frage: Wann verwende ich sie, da das obige Beispiel aus dem Buch wahrscheinlich nicht sehr gut ist.
Antworten:
Ich denke, es gibt viele Situationen, in denen
begin ... end
Blöcke praktisch sind, aber wie Sie bemerkt haben, können Sie oft auch mit anderen Konstrukten wie Funktionen usw. einen ähnlichen Effekt erzielen.Wofür könnten
begin ... end
Blöcke verwendet werden?len
,breadth
, undheight
besteht nur innerhalb des Blocks und nicht die umgebenden Namensraum verschmutzen.@inbounds begin <all my code without bounds checking goes here> end
oder@time begin ... end
um einen Code herum.begin ... end
erwähnt, kein lokaler Bereich eingeführt wird, das Argument jedoch für den ähnlichenlet ... end
Block gilt.)Insbesondere ist der zweite Punkt, wofür ich sie in meinen Codes verwende.
quelle
begin
Blöcke führen keinen Umfang ein . Andererseits konvertieren sie eine Folge von Anweisungen in einen Ausdruck, was nützlich sein kann, wenn Sie Code mit / aus einem Makro generieren.let ... end
was einen lokalen Bereich einführt. Wird meine Antwort korrigieren.begin
Blöcke einen lokalen Bereich einführen.Zu verallgemeinern , was alle anderen gesagt hat: Blöcke können Sie eine Liste von konvertieren Aussagen (syntaktische „Sätze“ , die keine Werte haben, dh sie können nicht zugeordnet werden) zu einem Ausdruck (eine „Phrase“ , die Werte darstellt , und können zugeordnet werden ).
Während Sie zum Beispiel nicht sollten, können Sie schreiben
x
dem Ergebnis einer Schleifenoperation zuzuweisen . (Mit der Einschränkung, dass die letzte Anweisung in der Sequenz tatsächlich ein Ausdruck sein muss - andernfalls hätten Sie keinen Wert für den Ausdruck.)Ein legitimer Anwendungsfall hierfür ist generierter Code. Zum Beispiel könnten Sie sich umdrehen
in
transparent für den Benutzer, während der
@something
frei beliebige Sprachkonstrukte erzeugen kann.Oder wenn Sie eine anonyme Funktion mit einem längeren Text schreiben möchten (und das
function
Formular nicht verwenden möchten ):quelle
x = y = 1
,a = if false end
undb = for i in 1:2 end
danachx
hat der Wert1
,a
undb
beide haben den Wertnothing
.if-else
Anweisung :a = if false; 1 else 2 end
. In diesem Fall ista
gleich2
.setproperty!
/setindex!
ist und es "traditionell" eine Sache ist, einen Wert zu haben (in C-ähnlichen Sprachen). Gleiches gilt fürif-else
einen Ausdruck in mehreren Sprachen. Aberfor
undif
ohneelse
einen "Standard" -Wert von zu habennothing
, sehe ich das nur als Artefakt.Eine Verwendung für diese Blöcke liegt im Verständnis:
Sie könnten eine Funktion erstellen und stattdessen innerhalb des Verständnisses verwenden, aber manchmal ist dies praktisch. Es wird immer dann verwendet, wenn Sie irgendwo einen mehrzeiligen Codeblock verwenden möchten, z. B. um ihn als Argument an ein Makro zu übergeben (das in der Teststandardbibliothek sehr häufig verwendet wird
@testset
).quelle
y^2 - y^4 + 2
in diesem Fall einfach schreiben . Vielleicht wäre es besser, ein Beispiel zu zeigen, in dem zwei (oder mehr) Schritte wirklich benötigt werden.Einfach ausgedrückt: "begin" bezeichnet nur einen Codeblock (siehe die Dokumentation dazu: https://docs.julialang.org/en/v1/base/base/#begin ).
Im obigen Beispiel ist nicht klar, ob die Verwendung eines begin-Blocks oder die Deklaration einer Funktion einen Wert hat.
Ich sehe nicht, dass dieses Schlüsselwort im Code sehr häufig verwendet wird, und ich persönlich habe es in der Praxis nie verwendet. Mein Vorschlag, einfach eine Funktion zu verwenden, da sie das Gleiche tut.
quelle
progn
In LISP).