为什么要复合表达式?

Geo*_*ery 10 julia

这是我正在阅读的一本书中的一个例子:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end
Run Code Online (Sandbox Code Playgroud)

为什么我需要复合表达式?我可以为那个或匿名函数编写volume = 10 * 20 * 30volume = len * breadth * height编写一个函数......

为什么我使用beginend?或可能是更好的问题: 我使用它们,因为我想从上面这本书的例子可能不是很好。

phi*_*ler 7

概括其他人所说的话:块允许您将语句列表(没有值,即无法赋值的句法“短语”)转换为一个表达式(表示值并且可以赋值的“短语”))。

例如,虽然你不应该,但你可以写

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)


Eri*_*ric 6

这些块的一种用途是理解:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]
Run Code Online (Sandbox Code Playgroud)

您可以创建一个函数并在理解中使用它,但有时这很方便。每当您想在某处使用多行代码块时都会使用它,例如作为参数传递给宏(这@testset在 Test 标准库中非常常用)。


log*_*ick 5

简单地说:“开始”只是表示一个代码块(请参阅有关此的文档:https : //docs.julialang.org/en/v1/base/base/#begin)。

在上面的示例中,不清楚使用 begin 块与声明函数是否有任何价值。

我没有看到该关键字在代码中被大量使用,而且我个人从未在实践中使用过它。我的建议是只使用一个函数,因为它会做同样的事情。


crs*_*nbr 4

我想在很多情况下begin ... end都很方便,但正如您所指出的,您通常也可以使用其他构造(例如函数等)实现类似的效果。

begin ... end块可以用来做什么?

  • 简单地“包含”变量及其名称:lenbreadth、 和height只会存在于块内,不会污染周围的命名空间。
  • 将宏应用于代码块而不是单个语句。例如@inbounds begin <all my code without bounds checking goes here> end,或者将 a@time begin ... end包裹在一段代码中。
  • 在周围的全局作用域中创建局部作用域(例如,避免全局作用域混淆)。(请注意,正如注释中所指出的那样,并未begin ... end引入局部作用域,但该参数适用于类似的块。)let ... end

特别是第二点是我在代码中使用它们的用途。