Gday Alle,F # Mutable zu Immutable
Ich habe in einigen F # in der letzten Zeit Dilettantismus und ich kam mit dem folgenden String-Builder, die ich von einigen C# -Code portiert. Es konvertiert ein Objekt in eine Zeichenfolge, sofern es eine in den Attributen definierte Regex übergibt. Es ist wahrscheinlich zu viel für die Aufgabe, aber es ist für Lernzwecke.
Momentan verwendet das BuildString-Member eine veränderbare Stringvariable updatedTemplate. Ich habe mir das Gehirn zerbrochen, um einen Weg zu finden, dies ohne irgendwelche veränderlichen Objekte ohne Erfolg zu tun. Was mich zu meiner Frage bringt.
Ist es möglich, die Memberfunktion BuildString ohne veränderbare Objekte zu implementieren?
Cheers,
Michael
//The Validation Attribute
type public InputRegexAttribute public (format : string) as this =
inherit Attribute()
member self.Format with get() = format
//The class definition
type public Foo public (firstName, familyName) as this =
[<InputRegex("^[a-zA-Z\s]+$")>]
member self.FirstName with get() = firstName
[<InputRegex("^[a-zA-Z\s]+$")>]
member self.FamilyName with get() = familyName
module ObjectExtensions =
type System.Object with
member this.BuildString template =
let mutable updatedTemplate : string = template
for prop in this.GetType().GetProperties() do
for attribute in prop.GetCustomAttributes(typeof<InputRegexAttribute>,true).Cast<InputRegexAttribute>() do
let regex = new Regex(attribute.Format)
let value = prop.GetValue(this, null).ToString()
if regex.IsMatch(value) then
updatedTemplate <- updatedTemplate.Replace("{" + prop.Name + "}", value)
else
raise (new Exception "Regex Failed")
updatedTemplate
open ObjectExtensions
try
let foo = new Foo("Jane", "Doe")
let out = foo.BuildInputString("Hello {FirstName} {FamilyName}! How Are you?")
printf "%s" out
with | e -> printf "%s" e.Message
Prost Brian und Jon . Ich werde die Falte implementieren und sehen, wie es sich herausstellt. Wie ich in der Frage erwähnt habe, ist dies eine rein akademische Übung. – Michael