Este é um exemplo de um livro que estou lendo:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Por que preciso de expressões compostas ?? Eu poderia apenas escrever volume = 10 * 20 * 30
ou volume = len * breadth * height
escrever uma função para essa ou uma função anônima ...
Por que eu uso begin
e end
? Ou a pergunta provavelmente melhor: quando eu os uso, como acho que o exemplo acima do livro provavelmente não é muito bom.
Respostas:
Eu acho que existem muitas situações em que os
begin ... end
blocos são úteis, mas como você observou, muitas vezes também é possível obter um efeito semelhante com outras construções, como funções, etc.Para que
begin ... end
blocos podem ser usados?len
,breadth
eheight
só existirá dentro do bloco e não poluir o namespace circundante.@inbounds begin <all my code without bounds checking goes here> end
ou envolvendo@time begin ... end
um pedaço de código.begin ... end
, não introduz um escopo local, mas o argumento é válido para olet ... end
bloco semelhante .)Em particular, o segundo ponto é para o que eu os uso nos meus códigos.
fonte
begin
blocos que não introduzir escopo . Por outro lado, eles convertem uma sequência de instruções em uma expressão, o que pode ser útil se você gerar código com / de uma macro.let ... end
que introduz um escopo local. Corrigirá minha resposta.begin
blocos introduzem um escopo local.Para generalizar o que todo mundo já disse: os blocos permitem converter uma lista de declarações ("frases" sintáticas que não possuem valores, ou seja, não podem ser atribuídas) em uma expressão (uma "frase" que representa valores e pode ser atribuída )
Por exemplo, embora não deva, você pode escrever
para atribuir
x
ao resultado de uma operação de loop. (Com a restrição de que a última instrução na sequência deve realmente ser uma expressão - caso contrário, você não teria valor para a expressão.)Um caso de uso legítimo disso é o código gerado. Por exemplo, você pode ativar
para dentro
transparente para o usuário, enquanto ele
@something
pode gerar livremente qualquer construção de linguagem.Ou se você deseja escrever uma função anônima com um corpo mais longo (e não usar o
function
formulário):fonte
x = y = 1
,,a = if false end
eb = for i in 1:2 end
, depois do qualx
tem o valor1
,a
eeb
ambos têm o valornothing
.if-else
declaração:a = if false; 1 else 2 end
. Nesse caso,a
é igual a2
.setproperty!
/setindex!
, e é "tradicionalmente" uma coisa para ter um valor (em linguagens C). O mesmo paraif-else
, que é uma expressão em alguns idiomas. Masfor
eif
semelse
ter um valor "padrão" denothing
, vejo isso apenas como um artefato.Um uso para esses blocos está nas compreensões:
Você pode criar uma função e usá-la dentro da compreensão, mas às vezes isso é conveniente. É usado sempre que você deseja usar um bloco de código com várias linhas em algum lugar, por exemplo, para passar como argumento para uma macro (que é muito comumente usada
@testset
na biblioteca padrão de teste).fonte
y^2 - y^4 + 2
neste caso. Talvez seja melhor mostrar um exemplo onde duas (ou mais) etapas são realmente necessárias.Simplificando: "begin" apenas indica um bloco de código (consulte os documentos sobre isso: https://docs.julialang.org/en/v1/base/base/#begin ).
No exemplo acima, não está claro se existe algum valor em usar um bloco de início versus declarar uma função.
Não vejo essa palavra-chave sendo muito usada no código e pessoalmente nunca a usei na prática. Minha sugestão é usar apenas uma função, pois ela fará a mesma coisa.
fonte
progn
no LISP).