我的源代码出现了下一个错误:
然后,我如何在F#中下一堂课?
type Person = class
member val Name: string
member val Age: int option = None
new() = { Name = "Anonymous" }
new(name) = { Name = name }
new(name, age: int) = { Name = name; Age = age }
static member Hello =
printfn "Hello, %O" Name
end
修改
根据这篇文章中的@ user2088029答案和Object initializer + property initializer (from C# to F#)中的@kvb答案,我创建了下一个源代码,我希望得到它。 问题是"人(姓名,年龄=年龄)"表示错误表示" 没有名为' Person'的可访问成员或对象构造函数。需要1个参数"。
type Person(name) =
member this.Name: string = name
member this.Age: int option = None //with get,set
new() = Person("Anonymous")
new(name, age: int) = Person(name, Age = age)
member this.Hello =
printfn "Hello, %O" this.Name
用法:
let person = Person("Alex", Option = Some 25)
答案 0 :(得分:2)
type Person(name : string,age : int option) =
new() = Person("Anonymous")
new(name) = Person(name,None)
new(name, age: int) = Person(name, Some age)
member this.Name : string = name
member this.Age : int option = age
member this.Hello() =
printfn "Hello, %O" this.Name
我不完全确定你想做什么,F#不是我的第一语言,我可能不会写这样的代码(我个人不喜欢多个构造函数) )...但无论如何
主构造函数放在类型名称后面。 然后你不需要"课程"和"结束"
主构造函数做了2件事
I)它定义了一个用于创建新对象/值的静态方法
ii)它定义了类
的字段/属性然后你有其他构造函数......
我假设您希望Name和Age成为Person类的实例方法?所以它们需要以对象变量为前缀,"这个"对OOers来说似乎是一个明智的名字。
你的静态方法不起作用,因为如果它是静态的,它没有变量来代表一个人,所以我把它实现为一个实例方法
我不太清楚为什么" class / end"构造存在,我怀疑它可能是因为你可以创建" struct / end"结构,这些没有构造函数,但我几乎从未见过" class / end"构造用于描述语法的教科书部分之外的任何地方。
答案 1 :(得分:2)
在修订后的代码段中,存在两个问题:
Age
属性是只读的,因此它没有setter 您可以通过将Age
转换为val
get, set
属性来修复前者,您可以使用(稍微有些奇怪的)语法来调用后者,然后调用基础构造函数,后跟额外的操作。以下作品:
type Person(name) =
member this.Name: string = name
member val Age = None with get, set
new() = Person("Anonymous")
new(name, age: int) as this = Person(name) then this.Age <- Some age
member this.Hello =
printfn "Hello, %O" this.Name
也就是说,@ user2088029的解决方案使得两个参数的构造函数都是主要的更好,我推荐使用它!