2016-04-08 12 views

Antwort

3

Ich glaube nicht, dass es eine direkte Art und Weise, dies zu tun, aber es ist eine schöne Abhilfe:

// Define a mutable variable with default value 
fsiSession.EvalInteraction "let mutable myVar = Unchecked.defaultof<int>" 

// Create a function that sets the value of the variable 
let f = evalExpressionTyped<int -> unit> "fun x -> myVar <- x" 

// Run the function to set the value of `myVar` to whatever we want 
f 42 

// As a bonus, use variable shadowing to make it immutable 
fsiSession.EvalInteraction "let myVar = myVar" 

Dies verwendet die evalExpressionTyped Helfer aus der Dokumentation FCS.

+0

Ich hoffte auf eine Möglichkeit, ein nicht-primitives Host-Objekt in das Skript zu übergeben. Obwohl, wenn nichts besser "auftaucht", werde ich fortfahren und diese Antwort akzeptieren, da sie technisch die gestellte Frage beantwortet. Idee: Ich könnte immer eine Zeichenkette verwenden und meinem Objekt erlauben, seinen Zustand von der Zeichenkette zu laden. Aber dann wird es eine andere Objektreferenz sein. – RoyalPotato

+0

Große Problemumgehung. Aber was ist der tiefe Grund, warum wir es nicht direkt machen können? – FZed

+0

@RoyalPotato Sie können damit auch nicht-primitive Typen bereitstellen. Sie müssen zuerst die '# r'-Interaktion auswerten, um die Assembly zu laden, von der der Typ stammt. –