let
语句能够自成一个作用域。通常,我们会让let
语句在开始处携带赋值语句,并以此定义相应的局部变量。另外,与其他的代码块一样,let
语句也可以包含子语句组。下面是一个简单的例子:
请注意其中的赋值语句。如果我们想在let
语句的开始处同时定义多个局部变量,那么可以在关键字let
的右边并列多条赋值语句,并用英文逗号分隔它们。你也许还记得我们在讲变量和常量的时候提到过的平行赋值法,如x, y = "Julia", "Golang"
。不过很可惜,平行赋值法不能被用在这里:
然而,我们是可以让它打印出Python
的。只要稍微调整一下其中的赋值语句就可以了,就像这样:
你可能会觉得在let
关键字右边的赋值语句x = x
很奇怪。它难道是把x
的值赋给了x
自己吗?
其次,与let
关键字处于同一行的赋值语句总是会在当前的作用域下创建新的局部变量。在这个等号左边的x
指代的就是一个新变量。然而,对等号右边的的求值会先于对此局部变量的创建。那时,在let
语句所代表的作用域下还没有名为x
的程序定义,所以等号右边的x
就会去指代那个在外面的全局变量x
。
因此,这里的x = x
其实就是在把全局变量x
的值赋给let
语句中的局部变量x
。你可别小看这条短短的赋值语句。let
语句中的这种赋值方式在 Julia 中是非常特别的。你可以思考一下,是否能够用别的形式完全实现上述代码的功能。你可以考虑利用关键字global
和local
,以及其他的代码块。
let
语句本身携带的赋值语句一定会在当前的作用域下创建新的局部变量,即使这个局部变量与外界的变量重名也是如此。或者说,这里的赋值语句总是会执行“定义并赋值”的操作。正因为如此,这里才存在着一种特殊的赋值方式。就像我在前面讲过的那样。