Wskazówki dotyczące formatowania kodu (F#)
Ten temat zawiera podsumowanie wskazówek Wcięcie kodu dla F#.Ponieważ język F# jest wrażliwy na podziały wiersza i wcięcia, jest nie tylko problem czytelności, estetyczne problem lub kodowania problem normalizacji do formatowania kodu poprawnie.Należy sformatować poprawnie dla niego prawidłowo skompilować kodu.
Ogólne zasady wcięcia
Gdy wymagane jest wcięcie, należy użyć spacje, tabulatory nie.Co najmniej jedną spacją.Organizacja może tworzyć normy kodowania, aby określić liczbę spacji, użyj wcięć; typową trzech lub czterech spacji wcięcia na każdym poziomie, w którym występuje wcięcia.Można skonfigurować Visual Studio odpowiadać organizacji wcięcia standardów poprzez zmianę opcji w Opcje okno dialogowe, które jest dostępne z Narzędzia menu.W Edytora tekstu węzła, rozwiń węzeł F# , a następnie kliknij przycisk kart. Opis dostępnych opcji, zobacz Opcje, edytor tekstu, wszystkie języki, karty.
Ogólnie rzecz biorąc gdy kompilator przetwarza swój kod, utrzymuje stosu wewnętrznego, która wskazuje bieżący poziom zagnieżdżenia.Gdy kod jest wcięty, nowy poziom zagnieżdżenia jest tworzony lub wkładany na ten stos wewnętrznego.Po zakończeniu konstrukcji, poziom jest tam pojawi.Wcięcie jest jednym ze sposobów zasygnalizować koniec poziomu i pop wewnętrznego stosu, ale niektóre tokeny również spowodować tam się pojawi, takich jak poziom end słowa kluczowego, lub nawias klamrowy zamykający lub nawias.
Kod w wielowierszowym konstrukcji, takich jak definicję typu definicji funkcji, try...with konstrukcji i konstrukcje, pętli musi wcięte względem linii otwarcia konstrukcji.Pierwszy wiersz z wcięciem ustanawia położenie kolumny dla kolejnych kodu w tym samym konstrukcji.Poziom wcięcia jest nazywany kontekst.Położenie kolumny określa minimalne kolumny określone jako offside linii, dla kolejnych linii kodu, które znajdują się w tym samym kontekście.W przypadku napotkania linii kodu jest wcięty mniej niż to położenie kolumny ustalonych, kompilator zakłada, że zakończyła kontekście i że użytkownik są teraz kodowania na następnym poziomie, w kontekście poprzedniego.Określenie offside jest używany do opisu warunku, w którym wiersz kodu wyzwala koniec konstrukcji, ponieważ nie jest wystarczająco daleko wcięty.Innymi słowy kod na lewo od linii offside jest offside.W kodzie poprawnie z wcięciami wykorzystasz offside regułę do ujęcia koniec konstrukcji.Użycie wcięcia w nieodpowiedni sposób, warunek offside może spowodować, że kompilatorowi ostrzeżenie lub może prowadzić do błędnej interpretacji kodu.
Offside linie są określane w następujący sposób.
= Token skojarzony z let offside wierszu kolumny pierwszy token po wprowadza = znak.
W if...then...else wyrażenie, pozycja kolumny pierwszy token po then słowa kluczowego lub else słowa kluczowego wprowadza linia offside.
W try...with wyrażenie, pierwszy token po try wprowadza linia offside.
W match wyrażenie, pierwszy token po with i pierwszy token po każdym -> wprowadzić wiersze offside.
Pierwszy token po with w typie rozszerzenie wprowadza linia offside.
Pierwszy token po nawias klamrowy otwierający nawias lub po begin słowa kluczowego, wprowadza linia offside.
Pierwszy znak słowa kluczowe let, if, i module wprowadzić wiersze offside.
Poniższe przykłady kodu ilustrują regułami wcięcia.W tym miejscu wydruku deklaracje polegać na wcięcie w celu skojarzenia ich z odpowiedniego kontekstu.Przy każdym przesuwa wcięcie, kontekście jest pojawiały się błędy i powraca do poprzedniego kontekstu.W związku z tym miejsce jest drukowana na końcu każdej iteracji; "Gotowe!" jest tylko drukowany jeden raz, ponieważ offside wcięcie ustanawia, że nie jest częścią pętli.Drukowanie ciągu "Kontekstu najwyższego poziomu" nie jest częścią funkcji.W związku z tym wydrukowaniu najpierw podczas inicjowania statyczne, zanim funkcja jest wywoływana.
let printList list1 =
for elem in list1 do
if elem > 0 then
printf "%d" elem
elif elem = 0 then
printf "Zero"
else
printf "(Negative number)"
printf " "
printfn "Done!"
printfn "Top-level context."
printList [-1;0;1;2;3]
Wprowadza dane wyjściowe.
Top-level context
(Negative number) Zero 1 2 3 Done!
Po przerwaniu zbyt długich linii kontynuacji wiersza musi wcięte dalej niż konstrukcja okalającego.Na przykład argumenty funkcji musi wcięte dalej niż pierwszy znak nazwy funkcji, jak pokazano w poniższym kodzie.
let myFunction1 a b = a + b
let myFunction2(a, b) = a + b
let someFunction param1 param2 =
let result = myFunction1 param1
param2
result * 100
let someOtherFunction param1 param2 =
let result = myFunction2(param1,
param2)
result * 100
Istnieją wyjątki od tych reguł, jak opisano w następnej sekcji.
Wcięcia w modułach
Kod w module lokalnych musi być wcięty względem modułu, ale kod w module najwyższego poziomu nie musi być wcięty.Elementy obszaru nazw, nie muszą być wcięty.
Poniższe przykłady kodu ilustrują to.
// Program1.fs
// A is a top-level module.
module A
let function1 a b = a - b * b
// Program2.fs
// A1 and A2 are local modules.
module A1 =
let function1 a b = a*a + b*b
module A2 =
let function2 a b = a*a - b*b
Aby uzyskać więcej informacji, zobacz Moduły (F#).
Wyjątki od zasad podstawowych wcięcia
Ogólną zasadą, jak opisano w poprzedniej sekcji, to że kod w konstrukcje wielowierszowego musi wcięte względem wcięcia pierwszego wiersza konstrukcji i koniec konstrukcji, zależy od po wystąpieniu pierwszego wiersza offside.Wyjątek od reguły o po końcu kontekstów jest, że niektóre konstrukcje, takie jak try...with wyrażenie, if...then...else wyrażenie i wykorzystania and Składnia deklaracji wzajemnie funkcji cyklicznej lub typów, mają wiele części.Wcięcie później części, takie jak then i else w if...then...else wyrażenie w tym samym poziomie jako tokenu, który uruchamia wyrażenie, ale zamiast wskazujący koniec do kontekstu, stanowi Następna część tym samym kontekście.W związku z tym if...then...else wyrażenie można zapisać, jak w poniższym przykładzie kodu.
let abs1 x =
if (x >= 0)
then
x
else
-x
Wyjątek offside reguła stosuje się tylko do then i else słowa kluczowe.W związku z tym chociaż nie jest to błąd wcięcia then i else , braku wcięcia wierszy kodu w then bloku produkuje się ostrzeżenie.Jest to zilustrowane w następujących wierszy kodu.
// The following code does not produce a warning.
let abs2 x =
if (x >= 0)
then
x
else
-x
// The following code is not indented properly and produces a warning.
let abs3 x =
if (x >= 0)
then
x
else
-x
Dla kodu w else blok, dodatkowe specjalne zasady stosuje się.Ostrzeżenie w poprzednim przykładzie występuje tylko na kod w then bloku, a nie na kod w else bloku.Umożliwia to napisanie kodu, który sprawdza, czy w różnych warunkach na początku funkcji bez wymuszania reszta kodu dla funkcji, które mogą być w else bloku wcięcia.W ten sposób można napisać następujące bez wytwarzania ostrzeżenie.
let abs4 x =
if (x >= 0) then x else
-x
Inny wyjątek do reguły, w tym celu kontekstach, gdy wiersz nie jest wcięty w odniesieniu do poprzedniego wiersza jest infiks operatorów, takich jak + i |>.Wiersze rozpoczynające się od operatorów infiks są dozwolone, aby rozpocząć (1 + oplength) kolumny przed normalnej pozycji bez wyzwalania punktu końcowego do kontekstu, gdzie oplength jest to liczba znaków tworzących operatora.Powoduje to pierwszy token po operatorze w celu wyrównania z poprzedniego wiersza.
Na przykład w poniższym kodzie + symbol jest dozwolone na dwie kolumny z wcięciami, mniej niż poprzedniego wiersza.
let function1 arg1 arg2 arg3 arg4 =
arg1 + arg2
+ arg3 + arg4
Chociaż zazwyczaj wcięcie zwiększa się poziomu zagnieżdżania staje się wyższy, istnieje kilka konstrukcje, w których kompilator pozwala na zresetowanie wcięcie dolnej pozycji kolumny.
Konstrukcje, pozwalające na zresetowanie położenie kolumny są w następujący sposób:
Organy funkcjach anonimowych.W poniższym kodzie wyrażenia wydruku zaczyna się od stanowiska kolumny, które jest oddala się po lewej stronie niż fun słowa kluczowego.Jednakże linii nie muszą zaczynać się od kolumnę na lewo od początku poprzedniego poziomu wcięcia (to znaczy, po lewej stronie L w List).
let printListWithOffset a list1 = List.iter (fun elem -> printfn "%d" (a + elem)) list1
Konstrukcje ujęty w nawiasy, lub przez begin i end w then lub else zablokować z if...then...else pod warunkiem wyrażenia, wcięcie jest nie mniejsza niż położenie kolumny z if słowa kluczowego.Wyjątek ten pozwala na styl kodowania, w której nawias otwierający lub begin jest używana na końcu wiersza po then lub else.
Moduły klas, interfejsów i struktur wyznaczoną przez organy begin...end, {...}, class...end, lub interface...end.Pozwala to na styl, w którym słowa kluczowego otwarcia z definicji typu może być na tym samym wierszu co nazwa typu bez wymuszania całe ciało być wcięty dalej niż słowa kluczowego otwarcia.
type IMyInterface = interface abstract Function1: int -> int end