Julia 为什么是复合表达式?
这是我正在读的一本书中的一个例子:Julia 为什么是复合表达式?,julia,Julia,这是我正在读的一本书中的一个例子: volume = begin len = 10 breadth = 20 height = 30 len * breadth * height end 为什么我需要复合表达式??我可以只写volume=10*20*30或volume=len*width*height或为此编写函数或匿名函数 为什么要使用开始和结束?或者一个可能更好的问题:我什么时候使用它们,因为我想书中上面的例子可能不是很好。简单地说:“开始”只是表示一个代码
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
为什么我需要复合表达式??我可以只写volume=10*20*30
或volume=len*width*height
或为此编写函数或匿名函数
为什么要使用
开始
和结束
?或者一个可能更好的问题:我什么时候使用它们,因为我想书中上面的例子可能不是很好。简单地说:“开始”只是表示一个代码块(请参阅此页上的文档:)
在上面的示例中,不清楚使用begin块与声明函数是否有任何价值
我不认为那个关键词在代码中被使用得太多,我个人也从未在实践中使用过。我的建议是,只使用一个函数,因为它会做同样的事情 我想在很多情况下都很方便,但正如您所指出的,您也可以通过其他构造(如函数等)实现类似的效果 什么可以开始。。。结束块是否用于
- 要简单地“包含”变量及其名称:
、len
和width
将只存在于块中,而不会污染周围的命名空间height
- 将宏应用于代码块而不是单个语句。例如
@inbounds begin(例如)。(请注意,正如注释
中指出的那样,没有引入局部范围,但该参数适用于类似的begin…end
块。)let…end
特别是第二点是我在代码中使用它们的原因。这些块的一个用途是理解:
A = [ begin
x = y^2
x - x^2 + 2
end
for y = 1:5 ]
你可以做一个函数,在理解中使用它,但是有时候这很方便。每当您想在某个地方使用多行代码块时,就可以使用它,例如将其作为参数传递给宏(它通常用于测试标准库中的
@testset
。来概括其他人说过的话:块允许您转换语句列表(语法“短语”)一个表达式(表示值并可以赋值的“短语”)
例如,虽然你不应该,但你可以写作
x = begin
s = 0
for i = 1:10
s += i^2
end
s
end
将x
分配给循环操作的结果。(限制序列中的最后一条语句实际上必须是表达式——否则,表达式将没有值。)
一个合法的用例是生成代码。例如,您可能会
x = @somthing bla blub
进入
对用户透明,而@something
可以自由生成任何语言构造
或者,如果您想编写一个具有较长正文的匿名函数(并且不使用函数
表单):
我还没有使用朱莉娅,但这正是我所想的。然而,当语言被设计时(可能是非常聪明的),人们一定有一个想法,对吧?我同意@logankilpatrick的观点,在很多情况下,你会想使用函数来代替。但我认为这些块的存在是有原因的(见我的答案)。@Georgery将一系列语句转换为表达式有时是一件有用的事情(参见LISP中的
progn
)。正如你正确指出的那样,在上下文中,这似乎是毫无意义的。我也不得不让自己放心,但是开始块。另一方面,它们将一系列语句转换为表达式,如果您使用宏/从宏生成代码,这将非常方便。哦,谢谢,在这方面,我把它与let。。。结束
,它确实引入了本地范围。我会纠正我的答案。我一直在做同样的错误假设:)这正是人们所期望的。@crstnbr你的第一颗子弹仍然是误导性的。似乎还是说begin
块引入了一个局部范围。那是什么书?正如你所说,这个例子并不是特别好的“学习朱莉娅”,这里有:(第127页)不是为了反对你的观点,但是在这种情况下,你可以写y^2-y^4+2
。也许最好给出一个真正需要两个(或更多)步骤的例子。@crstnbr你是对的,但我刚开始使用了书中的例子,只是对合理的用法很感兴趣。比如,为了节省两次计算一些昂贵的中间值的时间。稍微澄清一下:在Julia中,语句确实有值,并且可以赋值。所以你可以在1:2结束时为i做x=y=1
,a=if false end
,和b=for i
,然后x
有值1
,a
和b
都有值nothing
,下面是一个分配if-else
语句值的更有用的示例:a=if-false;1其他2结束
。在本例中,a
等于2
。对,它们有值,并且在技术上也是表达式。赋值是一个表达式,因为它基本上是setproperty代码>/设置索引代码>,而且它“传统上”有一个值(在类似C的语言中)。对于if-else
,也一样,这是两种语言中的一个表达式。但是对于
和
如果
没有
其他的“默认”值为无,我认为这仅仅是一个工件。
x = begin
(stuff involving bla and blub)
end
f = x -> begin
...
end