我对 R 相当陌生,在阅读手册时,我偶然发现了一段关于词法作用域的文章以及以下代码示例:
open.account <- function(total) {
list(
deposit = function(amount) {
if(amount <= 0)
stop("Deposits must be positive!\n")
total <<- total + amount
cat(amount, "deposited. Your balance is", total, "\n\n")
},
withdraw = function(amount) {
if(amount > total)
stop("You don't have that much money!\n")
total <<- total - amount
cat(amount, "withdrawn. Your balance is", total, "\n\n")
},
balance = function() {
cat("Your balance is", total, "\n\n")
}
)
}
ross <- open.account(100)
robert <- open.account(200)
ross$withdraw(30)
ross$balance()
robert$balance()
ross$deposit(50)
ross$balance()
ross$withdraw(500)
所以,我理解上面的代码做了什么,我想我仍然对它的工作原理感到困惑。如果在函数执行完成后您仍然可以访问函数的“局部”变量,那么预测何时不再需要变量不是很难或不可能吗?在上面的代码中,如果它被用作更大程序的一部分,“total”是否会保存在内存中,直到整个程序完成?(本质上成为一个全局变量内存)如果这是真的,不会这会导致内存使用问题吗?
我在这个网站上查看了另外两个问题:“词汇范围是如何实现的?” 和“为什么编译器更喜欢词法范围?”。那里的答案在我脑海中浮现,但它让我想知道:如果(正如我猜测的那样)编译器不只是使所有变量成为全局变量(内存方面),而是使用某种技术来预测某些变量何时不会不再需要并且可以删除,做这项工作实际上不会使编译器更难而不是更容易吗?
我知道这是很多不同的问题,但任何帮助都会很好,谢谢。