F# 初始化私有变量以供后续使用
是否可以初始化模块中的私有值,然后稍后调用另一个函数来读取该值?不过我得到了一个空字符串 数据/凭证.fsF# 初始化私有变量以供后续使用,f#,F#,是否可以初始化模块中的私有值,然后稍后调用另一个函数来读取该值?不过我得到了一个空字符串 数据/凭证.fs type Credentials = { mutable clientId: string; } module Authentication = let private credentials = { clientId = "old"; } let init (claims: Credentials) = cred
type Credentials = {
mutable clientId: string;
}
module Authentication =
let private credentials = {
clientId = "old";
}
let init (claims: Credentials) =
credentials.clientId <- claims.clientId // updating value
let requestToken =
printfn "reading %s\n" credentials.clientId // reading updated value
let credentials = {
clientId = "new";
}
init credentials // set credentials
requestToken // read credentials
Authentication.fs
type Credentials = {
mutable clientId: string;
}
module Authentication =
let private credentials = {
clientId = "old";
}
let init (claims: Credentials) =
credentials.clientId <- claims.clientId // updating value
let requestToken =
printfn "reading %s\n" credentials.clientId // reading updated value
let credentials = {
clientId = "new";
}
init credentials // set credentials
requestToken // read credentials
预期输出:
阅读新
实际输出:
读旧
requestToken
被定义为变量,它包含printfn“读取%s\n”凭据的结果。clientId
。你想要的可能是
let requestToken () =
printfn "reading %s\n" credentials.clientId
...
requestToken ()
requestToken
被定义为变量,它包含printfn“读取%s\n”凭据的结果。clientId
。你想要的可能是
let requestToken () =
printfn "reading %s\n" credentials.clientId
...
requestToken ()
哦,非常感谢,我已经和它斗争了很长时间顺便问一下,像这样编程好吗,我希望这不是对惯用函数式编程的反对?i、 e.要将所有参数传递给每个函数,以形成一个完全独立的孤立函数,请启发理解right@App2015如果您使用的是
mutable
关键字,这是一个很好的迹象,表明您没有进行惯用的函数式编程。@非常感谢,我也有疑问,在我的用例中,如果我使用惯用方法,那么调用者必须将凭据连同其他必需的参数一起传递给该库中定义的每个函数,一个想法是将它们,请进一步说明。@App2015如果没有更广泛的问题背景,很难提供帮助,但如果您的函数依赖于或转换某些提供的凭据,那么显式传递它们(并在需要更改时返回新的不可变凭据)可能是正确的方法。噢,非常感谢,我已经和它斗争了很长时间顺便问一下,像这样编程好吗,我希望这不是针对惯用函数式编程?i、 e.要将所有参数传递给每个函数,以形成一个完全独立的孤立函数,请启发理解right@App2015如果您使用的是mutable
关键字,这是一个很好的迹象,表明您没有进行惯用的函数式编程。@非常感谢,我也有疑问,在我的用例中,如果我使用惯用方法,那么调用者必须将凭据连同其他必需的参数一起传递给该库中定义的每个函数,一个想法是将它们,请进一步说明。@App2015如果没有更广泛的问题背景,很难提供帮助,但如果您的函数依赖于或转换某些提供的凭据,则显式传递它们(并在需要更改时返回新的不可变凭据)可能是正确的方法。