Voici un exemple d'un livre que je lis:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Pourquoi ai-je besoin d'expressions composées ?? Je pourrais simplement écrire volume = 10 * 20 * 30
ou volume = len * breadth * height
ou écrire une fonction pour cela ou une fonction anonyme ...
Pourquoi dois-je utiliser begin
et end
? Ou la question probablement meilleure: quand dois-je les utiliser, car je suppose que l'exemple ci-dessus du livre n'est probablement pas très bon.
Réponses:
Je suppose qu'il existe de nombreuses situations dans lesquelles les
begin ... end
blocs sont pratiques, mais comme vous l'avez noté, vous pouvez souvent également obtenir un effet similaire avec d'autres constructions, telles que des fonctions, etc.À quoi pourraient
begin ... end
servir les blocs?len
,breadth
etheight
existera uniquement dans le bloc et ne pollue pas l'espace de noms environnant.@inbounds begin <all my code without bounds checking goes here> end
ou enrouler un@time begin ... end
autour d'un morceau de code.begin ... end
n'introduit pas de portée locale, mais l'argument est valable pour lelet ... end
bloc similaire .)En particulier, le deuxième point est la raison pour laquelle je les utilise dans mes codes.
la source
begin
blocs ne pas présenter la portée . D'un autre côté, ils convertissent une séquence d'instructions en une expression, ce qui peut être pratique si vous générez du code avec / à partir d'une macro.let ... end
ce qui introduit une portée locale. Corrigera ma réponse.begin
blocs introduisent une portée locale.Pour généraliser ce que tout le monde a dit: les blocs vous permettent de convertir une liste d' instructions ("phrases" syntaxiques qui n'ont pas de valeurs, c'est-à-dire ne peuvent pas être affectées) en une expression (une "phrase" qui représente des valeurs et peut être affectée ).
Par exemple, alors que vous ne devriez pas, vous pouvez écrire
à affecter
x
au résultat d'une opération de bouclage. (Avec la restriction que la dernière instruction de la séquence doit en fait être une expression - sinon, vous n'auriez aucune valeur pour l'expression.)Un cas d'utilisation légitime de ce code est généré. Par exemple, vous pouvez activer
dans
de manière transparente pour l'utilisateur, tandis que le
@something
peut générer librement toutes les constructions de langage.Ou si vous voulez écrire une fonction anonyme avec un corps plus long (et ne pas utiliser le
function
formulaire):la source
x = y = 1
,a = if false end
etb = for i in 1:2 end
, après quoix
a la valeur1
, eta
et lesb
deux ont la valeurnothing
.if-else
déclaration:a = if false; 1 else 2 end
. Dans ce cas,a
est égal à2
.setproperty!
/setindex!
, et c'est "traditionnellement" une chose pour qu'elle ait une valeur (dans les langages de type C). Pareil pourif-else
, qui est une expression dans deux langues. Maisfor
etif
sanselse
avoir une valeur "par défaut" denothing
, je vois cela comme un simple artefact.Une utilisation pour ces blocs est dans les compréhensions:
Vous pouvez créer une fonction et l'utiliser à la place dans la compréhension, mais cela est parfois pratique. Il est utilisé chaque fois que vous souhaitez utiliser un bloc de code multiligne quelque part, par exemple pour passer comme argument à une macro (qui est très couramment utilisée
@testset
dans la bibliothèque standard de test).la source
y^2 - y^4 + 2
dans ce cas. Il serait peut-être préférable de montrer un exemple où deux (ou plus) étapes sont vraiment nécessaires.Autrement dit: «commencer» désigne simplement un bloc de code (voir la documentation à ce sujet: https://docs.julialang.org/en/v1/base/base/#begin ).
Dans l'exemple ci-dessus, il n'est pas clair qu'il y ait une quelconque valeur à utiliser un bloc begin vs déclarer une fonction.
Je ne vois pas ce mot-clé très utilisé dans le code et personnellement je ne l'ai jamais utilisé dans la pratique. Ma suggestion donc d'utiliser simplement une fonction car elle fera la même chose.
la source
progn
dans LISP).