Mam następujący F # program:Different zachowanie na F modułu # inicjalizacji
open MyModule
printfn "%d" test
Z mymodule samopoczucie:
module MyModule
printfn "foo"
let test =
printfn "bar"
42
To daje następujący wynik:
foo
bar
42
Kiedy zmienić Mój moduł do:
module MyModule
printfn "foo"
let test =
// printfn "bar" <-- note the comment!
42
... wynik jest:
42
Dlaczego nie "foo" wydrukowany więcej?
Dziękuję, po przeczytaniu go kilka razy rozumiem. Chociaż zachowanie wydaje się zbyt skomplikowane/niekonsekwentne. Na przykład "let test = 1 + 2" nie drukuje "foo", podczas gdy "let test = add 1 2" z add jest "dodaj b = a + b" drukuje "foo". Jest to zgodne ze specyfikacją językową, ale nadal wydaje się dziwne. Czy istnieje powód, dla którego inicjatory statyczne nie są wykonywane po pierwszym dostępie do dowolnego elementu modułu, bez względu na to, czy jest to proste wyrażenie stałe, czy coś innego? – stmax
Zaktualizowałem swoją odpowiedź, aby zademonstrować, że C# zachowuje się podobnie. Przypuszczam, że może to być optymalizacja wydajności. Ponieważ niemożliwe jest, aby stała była zależna od efektów ubocznych lub jakiegokolwiek obliczenia, nie ma wyraźnego powodu inicjalizacji statycznej przed uzyskaniem dostępu do niej. – Daniel