3

有什么方法可以更新在 let-in-end 表达式中绑定在全局范围内的变量?

例如,如果我有一个全局变量:

val playerScore = 0; 

然后是函数:

fun hit (option:int) = 
    if option = 2 then
        printStay(playerScore, dealerScore)
    else 
        let
            val cardDrawn = showCard(hd deck)
            val playerScore = playerScore + getValue(hd deck)
        in 
            print ("You chose to hit\n" ^ cardDrawn ^ "Dealer Score: " ^ Int.toString(dealerScore) ^ "\nPlayer Score: " ^ Int.toString(playerScore) ^ "\n")  
        end; 

playerScore 的值在 let 表达式中更新,并在“in”子句中打印正确的值,但 playerScore 的实际值不保存,并在此表达式完成后重置。

在这个表达式执行后,无论如何要在全局级别上保留 playerScore 的值吗?问题是我无法跟踪分数,因为它每次都重置为 0。

谢谢

4

1 回答 1

9

在 ML 中永远不能分配“变量”。的值playerScore,一旦初始化,就永远不会改变。时期。

在您的示例中,您正在声明一个在内部范围中调用的新变量,该变量隐藏了外部变量。playerScore它是一个不同的变量,与同名的外部变量无关。

如果要使用可变性,可以使用可变数据结构,其中最简单的是“ref”单元格,即单项可变单元格。您可以使用该ref函数创建 ref 数据结构,!操作符访问其内容,:=操作符更改其内容。但是突变只能通过可变数据结构(如ref、数组等)发生。变量不能更改。

于 2013-04-13T07:07:26.210 回答