2016-09-25 173 views
0

F#非常新。我有這樣的一個類如何從成員函數中賦予類的成員變量

namespace FsharpTestSystem 

open System 
open System.IO 
open System.Text 
open System.Diagnostics 

open System.CodeDom 
open Microsoft.FSharp.Compiler.SourceCodeServices 
open Microsoft.FSharp.Compiler.Interactive.Shell 
open Microsoft.FSharp.Compiler.SimpleSourceCodeServices 

type TestSystem() = 
// Intialize output and input streams 
// Build command line arguments & start FSI session 

    let argv = [| "C:\\Program Files (x86)\\Microsoft SDKs\\F#\\4.1\\Framework\\v4.0\\fsi.exe" |] 
    let allArgs = Array.append argv [|"--noninteractive"|] 

    let sbOut = new StringBuilder() 
    let sbErr = new StringBuilder() 
    let inStream = new StringReader("") 
    let outStream = new StringWriter(sbOut) 
    let errStream = new StringWriter(sbErr) 
    let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() 


.... 

我給這個類添加一個成員方法(函數)。但是,如何將返回值賦給類的成員變量以便其他成員可以看到?換句話說,fsis需要由TestSystem的其他成員使用

在C#中,通過使用屬性,這是微不足道的。我懷疑我需要告訴F#系統fsis在聲明時可以以某種方式變化。

member this.LoadFSI() = 
    fsis = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 

member this.UseFSI() = 
    //I need to use fsis in here. 
+0

例如fsiConfig等在您的課堂內是否可用?是否有可能在C#中發佈一些簡單的內容,以達到您想要的效果? – s952163

+0

我修改了F#示例。除了初始化這個函數FsiEvaluationSession.Create以外,這些變量是無關緊要的。之後,他們不使用。 – Ivan

+0

順便說一句,我不能在構造函數中執行FsiEvaluationSession.Create的原因是,如果我把它放在那裏,程序就會崩潰。如果我把它放在一個成員函數中,它就可以工作。但是,我無法從其他地方訪問返回值。 – Ivan

回答

0

你住在刀刃上......這個怎麼樣:

type TestSystem() = 
    // .... 
    [<DefaultValue>] val mutable Fsis : FsiEvaluationSession 
    member __.LoadFsis() = __.Fsis <- FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 
    member __.UseFsis() = __.Fsis.GetHashCode() 


let ts = TestSystem() 
ts.LoadFsis() 
ts.UseFsis() 
ts.Fsis.GetHashCode() 
ts.LoadFsis() 
ts.UseFsis() 

從哈希碼(我認爲),你可以看到,只要你不這樣做.LoadFsis它是使用同一屆會議。我相信這可以變得更漂亮。

相關問題