通过返回函数隐藏 System.Random 实例
Hiding a System.Random instance by returning a function
以下代码来自Stylish F# 6: Crafting Elegant Functional Code for .NET 6清单9-13:
let randomByte =
let r = System.Random()
fun () ->
r.Next(0, 255) |> byte
// E.g. A3-52-31-D2-90-E6-6F-45-1C-3F-F2-9B-7F-58-34-44-
for _ in 0..15 do
printf "%X-" (randomByte())
printfn ""
作者指出,“虽然我们多次调用 randomByte(),但只创建了一个 System.Random() 实例。”
我理解 randomByte returns 一个不创建 System.Random() 实例的函数,但在我看来每次都会创建多个 System.Random() 实例for-do-loop 无论如何。
如果能解释一下在这种情况下如何不创建 System.Random() 的多个实例,我将不胜感激。
关键是 randomByte
是 不是函数 。它是一个具有一些复杂初始化逻辑的值。例如,我可以写:
let x = 5
或者我可以这样写:
let x =
let fourtyTwo = 42
let thirtySeven = 37
fourtyTwo - thirtySeven
这些是等价的。两者都声明了一个名为 x
且等于 5
的值。我希望你能看到表达式 fourtyTwo - thirtySeven
是如何只计算一次的,而不是每次有人得到 x
.
的值时
所以它也适用于 randomByte
:它是一个具有 non-trivial 初始化逻辑的值。在那个值的初始化过程中,首先它创建了一个 System.Random
的实例,然后它创建了一个关闭该实例的匿名函数,这个匿名函数成为 randomByte
.
的值。
以下代码来自Stylish F# 6: Crafting Elegant Functional Code for .NET 6清单9-13:
let randomByte =
let r = System.Random()
fun () ->
r.Next(0, 255) |> byte
// E.g. A3-52-31-D2-90-E6-6F-45-1C-3F-F2-9B-7F-58-34-44-
for _ in 0..15 do
printf "%X-" (randomByte())
printfn ""
作者指出,“虽然我们多次调用 randomByte(),但只创建了一个 System.Random() 实例。”
我理解 randomByte returns 一个不创建 System.Random() 实例的函数,但在我看来每次都会创建多个 System.Random() 实例for-do-loop 无论如何。
如果能解释一下在这种情况下如何不创建 System.Random() 的多个实例,我将不胜感激。
关键是 randomByte
是 不是函数 。它是一个具有一些复杂初始化逻辑的值。例如,我可以写:
let x = 5
或者我可以这样写:
let x =
let fourtyTwo = 42
let thirtySeven = 37
fourtyTwo - thirtySeven
这些是等价的。两者都声明了一个名为 x
且等于 5
的值。我希望你能看到表达式 fourtyTwo - thirtySeven
是如何只计算一次的,而不是每次有人得到 x
.
所以它也适用于 randomByte
:它是一个具有 non-trivial 初始化逻辑的值。在那个值的初始化过程中,首先它创建了一个 System.Random
的实例,然后它创建了一个关闭该实例的匿名函数,这个匿名函数成为 randomByte
.