gpt4 book ai didi

f# - 如何在构造函数中抛出异常?

转载 作者:行者123 更新时间:2023-12-04 22:14:07 25 4
gpt4 key购买 nike

如果我这样做没有意义吗

type Point = 
struct
val Row: int
val Column: int

new (row, column) = if row >= 0 && column >= 0 then { Row = row; Column = column }
else failwith "Cooridinators must be non-negative!"
// This is not a valid object construction
static member (+) (x: Point, y: Point) = Point (x.Row + y.Row, x.Column + y.Column)
static member (-) (x: Point, y: Point) = Point (x.Row - y.Row, x.Column - y.Column)
static member (*) (x: Point, a) = Point (x.Row * a, x.Column * a)
static member (*) (a, x: Point) = Point (x.Row * a, x.Column * a)
end

如果它是一个类,那么也许我可以在 do 期间引发异常绑定(bind),但在结构中没有 do , 我应该做些什么?

我发现可以在 failwith 之后添加另一个构造函数为了解决这个问题,但它提出了另一个问题,我如何调用隐式构造函数?我必须先明确地构造它吗
new () = { Row = 0; Column = 0} 
// Error structs auto supports a default constructor

如果我只是使用默认构造函数执行此操作
new (row, column) = if row >= 0 && column >= 0 then { Row = row; Column = column }
else
failwith "Cooridinators must be non-negative!"
new Point () // error

在我看来 Point ()返回一个单位而不是 Point ?

最佳答案

我认为 F# 编译器会提示,因为构造函数应该总是有一个结构:

new ( patterns ) = expressions { initialization } [then expressions ]



所以,初始化字段的部分不能嵌套在 if下。或在任何其他表达式中。您可以在初始化之前或之后抛出异常(如果添加 then 关键字)。 (这对于具有继承的类很重要,但我认为它对结构没有任何影响。)

因此,编写代码的一种方法是编写:
type Point = 
struct
val Row: int
val Column: int

new (row, column) =
if row < 0 || column < 0 then failwith "Cooridinators must be non-negative!"
{ Row = row; Column = column }

// (Static members omitted)
end

请注意,我必须否定条件,因为您需要指定要抛出异常的情况(而不是说何时可以构造对象)。另一种选择是:
new (row, column) = 
{ Row = row; Column = column }
then if row < 0 || column < 0 then failwith "Cooridinators must be non-negative!"

关于f# - 如何在构造函数中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348922/

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