使用替代类语法在构造函数中添加代码

时间:2009-11-17 01:41:24

标签: syntax f# constructor

type Foo = 
    class
        inherit Bar

        val _stuff : int

        new (stuff : int) = {
            inherit Bar()
            _stuff = stuff
        }
    end

我想在上面的构造函数中添加此代码:

if (stuff < 0) then raise (ArgumentOutOfRangeException "Stuff must be positive.")
else ()

如何在F#中实现这一目标?

2 个答案:

答案 0 :(得分:5)

您可以在不需要任何解决方法的情况下执行此操作,但初始左侧卷曲的位置相当敏感(或者解析器可能有错误?)。首先要做到这一点:

type Foo =
  class
    inherit Bar
    val _stuff : int
    new (stuff : int) = 
      if stuff < 0 then raise (System.ArgumentOutOfRangeException("Stuff must be positive"))
      { 
        inherit Bar() 
        _stuff = stuff 
      }
  end

要做第二个效果:

type Foo =
  class
    inherit Bar
    val _stuff : int
    new (stuff : int) = 
      { 
        inherit Bar() 
        _stuff = stuff 
      }
      then if stuff < 0 then raise (System.ArgumentOutOfRangeException("Stuff must be positive"))
  end

答案 1 :(得分:3)

嗯,看起来像语法中的漏洞;我会提出一个建议。你可以像这样解决它:

type Bar() = class end

type Foo =     
    class        
        inherit Bar        
        val _stuff : int        
        private new (stuff : int, dummyUnused : int) = {            
            inherit Bar()            
            _stuff = stuff        
            }
        new (stuff : int) = 
            Foo(stuff, 0)
            then
                if (stuff < 0) then 
                    raise (System.ArgumentOutOfRangeException 
                             "Stuff must be positive.")
    end

其中第一个构造函数是一个虚拟对象,其唯一目的是允许第二个真正的构造函数使用“other-constructor then side-effect”语法调用它。

但是如果你使用

,你将过上更长寿,更幸福的生活
type Foo(_stuff:int) =     
    inherit Bar()
    do
        if (_stuff < 0) then 
            raise (System.ArgumentOutOfRangeException "Stuff must be positive.")

代替。 尽可能使用具有主构造函数的类。('主构造函数'是类声明中的构造函数 - 在上面的示例中,紧跟在“类型Foo”之后的参数是构造函数参数,并且任何let类主体内的/ do语句定义主构造函数体。)

编辑:

这是一个更简单的解决方法

type Foo =     
    class        
        inherit Bar        
        val _stuff : int        
        new (stuff : int) = 
            let effect = 
                if (stuff < 0) then 
                    raise (System.ArgumentOutOfRangeException 
                            "Stuff must be positive.")
            {            
            inherit Bar()            
            _stuff = stuff        
            }
    end