这是我正在阅读的一本书中的一个例子:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Run Code Online (Sandbox Code Playgroud)
为什么我需要复合表达式?我可以为那个或匿名函数编写volume = 10 * 20 * 30或volume = len * breadth * height编写一个函数......
为什么我使用begin和end?或可能是更好的问题:当 我使用它们,因为我想从上面这本书的例子可能不是很好。
概括其他人所说的话:块允许您将语句列表(没有值,即无法赋值的句法“短语”)转换为一个表达式(表示值并且可以赋值的“短语”))。
例如,虽然你不应该,但你可以写
x = begin
s = 0
for i = 1:10
s += i^2
end
s
end
Run Code Online (Sandbox Code Playgroud)
分配x给循环操作的结果。(限制序列中的最后一个语句必须实际上是一个表达式——否则,您将没有该表达式的值。)
一个合法的用例是生成的代码。例如,您可能会转
x = @somthing bla blub
Run Code Online (Sandbox Code Playgroud)
进入
x = begin
(stuff involving bla and blub)
end
Run Code Online (Sandbox Code Playgroud)
对用户透明,同时@something可以自由生成任何语言结构。
或者,如果您想编写一个具有更长主体的匿名函数(而不是使用function表单):
f = x -> begin
...
end
Run Code Online (Sandbox Code Playgroud)
这些块的一种用途是理解:
A = [ begin
x = y^2
x - x^2 + 2
end
for y = 1:5 ]
Run Code Online (Sandbox Code Playgroud)
您可以创建一个函数并在理解中使用它,但有时这很方便。每当您想在某处使用多行代码块时都会使用它,例如作为参数传递给宏(这@testset在 Test 标准库中非常常用)。
简单地说:“开始”只是表示一个代码块(请参阅有关此的文档:https : //docs.julialang.org/en/v1/base/base/#begin)。
在上面的示例中,不清楚使用 begin 块与声明函数是否有任何价值。
我没有看到该关键字在代码中被大量使用,而且我个人从未在实践中使用过它。我的建议是只使用一个函数,因为它会做同样的事情。
我想在很多情况下begin ... end块都很方便,但正如您所指出的,您通常也可以使用其他构造(例如函数等)实现类似的效果。
begin ... end块可以用来做什么?
len、breadth、 和height只会存在于块内,不会污染周围的命名空间。@inbounds begin <all my code without bounds checking goes here> end,或者将 a@time begin ... end包裹在一段代码中。begin ... end引入局部作用域,但该参数适用于类似的块。)let ... end特别是第二点是我在代码中使用它们的用途。