Este es un ejemplo de un libro que estoy leyendo:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
¿Por qué necesito expresiones compuestas? Podría escribir volume = 10 * 20 * 30
o volume = len * breadth * height
escribir una función para eso o una función anónima ...
¿Por qué uso begin
y end
? O la pregunta probablemente mejor: ¿ cuándo los uso, ya que supongo que el ejemplo anterior del libro probablemente no sea muy bueno?
Respuestas:
Supongo que hay muchas situaciones en las que los
begin ... end
bloques son útiles, pero como notó, a menudo también puede lograr un efecto similar con otras construcciones, como funciones, etc.¿Para qué podrían
begin ... end
usarse los bloques?len
,breadth
yheight
sólo existirá dentro del bloque y no contamina el espacio de nombres circundante.@inbounds begin <all my code without bounds checking goes here> end
o envolviendo un@time begin ... end
código de una pieza.begin ... end
, no introduce un alcance local, pero el argumento es válido para ellet ... end
bloque similar ).En particular, el segundo punto es para qué los uso en mis códigos.
fuente
begin
los bloques qué no presento alcance . Por otro lado, convierten una secuencia de declaraciones en una expresión, lo que puede ser útil si genera código con / desde una macro.let ... end
lo que introduce un alcance local. Corregirá mi respuesta.begin
bloques introducen un alcance local.Para generalizar lo que todos han dicho: los bloques le permiten convertir una lista de declaraciones ("frases" sintácticas que no tienen valores, es decir, no se pueden asignar) a una expresión (una "frase" que representa valores y se puede asignar )
Por ejemplo, aunque no deberías, puedes escribir
asignar
x
al resultado de una operación de bucle. (Con la restricción de que la última instrucción de la secuencia debe ser realmente una expresión; de lo contrario, no tendría ningún valor para la expresión).Un caso de uso legítimo de esto es el código generado. Por ejemplo, podrías activar
dentro
transparente para el usuario, mientras que
@something
puede generar libremente cualquier construcción de lenguaje.O si desea escribir una función anónima con un cuerpo más largo (y no usar el
function
formulario):fuente
x = y = 1
,,a = if false end
yb = for i in 1:2 end
después de lo cualx
tiene el valor1
,a
yb
ambos tienen el valornothing
.if-else
declaración:a = if false; 1 else 2 end
. En este caso,a
es igual2
.setproperty!
/setindex!
, y es "tradicionalmente" que tenga un valor (en lenguajes tipo C). Lo mismo paraif-else
, que es una expresión en un par de idiomas. Perofor
yif
sinelse
tener un valor "predeterminado" denothing
, veo eso como un mero artefacto.Un uso para estos bloques es en las comprensiones:
Podrías hacer una función y usarla dentro de la comprensión, pero a veces esto es conveniente. Se usa siempre que desee usar un bloque de código multilínea en algún lugar, por ejemplo, para pasarlo como argumento a una macro (que se usa muy comúnmente
@testset
desde la biblioteca estándar de Prueba).fuente
y^2 - y^4 + 2
en este caso. Quizás sería mejor mostrar un ejemplo donde realmente se necesitan dos (o más) pasos.En pocas palabras: "comenzar" solo denota un bloque de código (vea los documentos sobre esto: https://docs.julialang.org/en/v1/base/base/#begin ).
En el ejemplo anterior, no está claro que haya un valor para usar un bloque de inicio frente a declarar una función.
No veo que esa palabra clave se use mucho en el código y personalmente nunca la he usado en la práctica. Mi sugerencia es que solo use una función, ya que hará lo mismo.
fuente
progn
en LISP).