2013-04-29 83 views
0

下面是简单的代码片段,我创建明白为什么我行动之前,在我的代码我可以对IDisposable对象使用“模糊”参数传递吗?

type IType = 
    inherit IDisposable 
    abstract say : string -> unit 

let St = { 
    new IType with 
     member i.say hi  = Console.Write hi 
     member i.Dispose() = Console.Write "So I disposed" 
    } 

let Say1(cmon : IType) = 
    using <| cmon 
      <| fun lol -> lol.say 

Say1 St " :(" // So I disposed :(

printfn "" 

let Say2(cmon : IType) (smile : string) = 
    using <| cmon 
      <| fun lol -> lol.say smile 

Say2 St " :) " // :) So I disposed 

我有两个问题在这里处理。

  • 确切地说St在第一次调用中处理?
  • 有语法的方式来传递的“模糊”的方法参数,但不破IDisposable

我需要它,因为我想传递printf相似的参数,我不知道它的数量。一旦相应SayN退出

+0

的参数看你的最后几个问题,他们似乎有一个共同的主题。你究竟想要做什么? – 2013-04-29 11:36:02

+0

我想使用printf相似的语法来登录到文件。我正试图找到优雅的解决方案。 – Cynede 2013-04-29 12:26:14

+0

那么为什么你不能使用fprintf? – 2013-04-29 21:09:39

回答

2

调用Dispose。

在第一种情况的函数退出(所以处置被称为),并返回string ->()类型,然后执行和输出其结果的功能。

在第二种情况下,结果被打印,则函数退出(以便处置该字符串打印到控制台之后被调用)

我要说的是,最好的解决办法是使用DU的参数 - 让你定义

type t = |N |S of string ... //for all possible cases 

,那么你只是让你的函数采取型t

+0

DU来获取参数吗?我不完全明白。请你提供一些相关的例子。 – Cynede 2013-04-29 08:09:05

+0

所以你的Say变成'let Say2(cmon:Itype)(arg:t)= using <| cmon <| fun t ->匹配arg与| S(s) - > t.say s ... //其他情况在此处。另外,你的语法有点奇怪,许多'<|'都没有用,而使用'Console.Write'而不是'printf'很奇怪。 – 2013-04-29 08:11:07

+0

我用Console.Write为例,'(arg:t)'仍然是一个参数。如果我想传递100个参数怎么办? – Cynede 2013-04-29 08:14:58

相关问题