gpt4 book ai didi

f# - 句点 (.) 在 F# 方法中的作用

转载 作者:行者123 更新时间:2023-12-04 18:30:15 32 4
gpt4 key购买 nike

很抱歉描述模糊,找不到更好的方式来说明它。

我从 F# 开始,和许多其他人一样,我将解决的欧拉问题转换为 F#。我喜欢使用测试来运行我的代码,也喜欢 FsUnit 风格。在给定示例的帮助下,我这样做了:

open System
open NUnit.Framework
open FsUnit

type EulerProblem() =
member this.problem1 = Seq.init 999 (fun n -> n + 1)
|> Seq.filter (fun n -> n % 3 = 0 || n % 5 = 0)
|> Seq.sum

[<TestFixture>]
type ``Given an Euler problem`` () =
let euler = new EulerProblem()

[<Test>] member test.
``when I try to solve #1 should return [the magic number]`` ()=
euler.problem1 |> should equal [the magic number]

这行得通,但我无法理解 test 之后的时间段。方法可以。如果我把它拿走,编译器会提示说:

This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args)



对不起,如果这是微不足道的,也许我没有使用正确的措辞,但无法通过谷歌得到答案。

谢谢

最佳答案

如果您熟悉 C#、Java 或 C++,可以使用 this 引用类实例。实例成员中的保留字。在 F# 中,您必须为每个成员定义显式地为类实例命名,在 FsUnit 示例中,给出的名称仅为 test但实际上并没有使用。您也可以将测试方法编写为

[<Test>] member this.
``when I try to solve #1 should return [the magic number]`` ()=
euler.problem1 |> should equal [the magic number]

但请注意,现在 xUnit.net 和 NUnit 都允许应用他们的 [<Fact>][<Test>]属性分别用于标记模块内的 let 绑定(bind)函数的测试,而不需要 TestFixture s 等,这更适合 F#。因此,例如,您提供的测试可以并且在我看来应该写成:
module EulerProblemTests () =
[<Test>]
let ``when I try to solve #1 should return [the magic number]`` () =
let euler = new EulerProblem()
euler.problem1 |> should equal [the magic number]

此外,您可能不想作为 type 的成员创建问题解决方案。喜欢 EulerProblem ,而不是作为模块内的函数。

关于f# - 句点 (.) 在 F# 方法中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533986/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com