Swift具有编译器(swiftc)和REPL。我喜欢使用REPL学习和使用语言构造。
在我的一项实验中,我发现“ let”是如何工作的显着差异。
正如我所期望的,以下是swiftc中不允许的,但是REPL允许。
let x = 10
let x = 20 // ok in REPL
现在我想知道还有什么其他区别。它们在任何地方都有记录吗?
在REPL环境中,您希望want能够重新声明变量,对吗?否则,当您继续使用REPL并声明越来越多的变量,let
常量,函数,类等时,将用尽所有名称!
例如,假设您要尝试字符串插值:
let x = 10
print("x is \(x)!")
然后过了一会儿,您了解了字符串连接,并且也想尝试一下。此时,您希望能够重新声明一个let
常量x
,对吗?
let x = "A"
let y = "B"
print(x + y)
您可能会争辩说可以使用a
或b
,但是随着时间的流逝,您会慢慢用尽名称。 REPL是这样设计的,因此您不必非常频繁地重新启动REPL。
因此,每次提交内容时,在提交中也声明过的先前声明的符号将被覆盖。
swiftc
具有完全不同的用例-您通常使用它来编译大型程序,而不仅仅是几行代码。在这种情况下,全局范围将具有更少的符号,并且重新声明变量实际上是不实际实现的,因为代码的执行不是从上到下都是线性的。可能还会有多个文件互相通信。您如何找出重新声明的内容?在REPL之外的任何地方都没有这样做的必要。
[其他REPL也具有此功能,例如C#和csharppad.com
的python
,因此,在实现REPL时,这实际上只是您的日常工作,没有特殊之处。