Sdílet prostřednictvím


Kód formátování pokyny (F#)

Toto téma shrnuje hlavní směry odsazení kódu pro F#.Protože F# jazyk rozlišuje zalomení řádků a odsazení, není právě problém čitelnost, estetické problém nebo kódovaný problém normalizaci správně formátování kódu.Váš kód správně jej zkompilovat správně, je nutné formátovat.

Obecná pravidla pro odsazení

Při odsazení je vyžadováno, je nutné použít mezery, tabulátory není.Je vyžadován alespoň jeden prostor.Organizace může vytvořit standardy kódování určit počet mezer pro odsazení; je obvykle tři nebo čtyři mezery odsazení na každé úrovni, kde dojde k odsazení.Můžete nakonfigurovat Visual Studio změnou možností v odpovídající standardy organizace odsazení Možnosti dialogové okno, které je k dispozici Nástroje nabídky.V Textový Editor uzlu, rozbalte položku F# a klepněte na tlačítko karty. Popis dostupných možnostech naleznete v tématu Možnosti textového editoru, všechny jazyky karty.

Obecně platí když kompilátor analyzuje váš kód, udržuje Vnitřní zásobník, který označuje aktuální úroveň vnoření.Při odsazen kód novou úroveň vnoření je vytvořen nebo posunuta do tohoto vnitřního zásobníku.Po skončení konstrukt úroveň je popped.Odsazení je jeden způsob konce úroveň a pop vnitřního zásobníku, ale některé tokeny také způsobit úroveň popped, jako například end klíčové slovo, nebo pravá složená závorka nebo závorku.

Kód v víceřádkové konstrukce, jako je například definice typu definice funkce try...with konstrukci a opakování konstrukce, musí být odsazen vzhledem k řádku otevírání konstruktu.S odsazením prvního řádku pozice sloupce pro následující kód vytváří ve stejné konstrukce.Úroveň odsazení, nazývá kontextu.Umístění sloupce Nastaví minimální sloupce, jen offside řádek, pro následující řádky kódu, které jsou ve stejném kontextu.Při výskytu řádek kódu odsazený méně než tento sloupec zavedené pozice, kompilátor předpokládá ukončení kontextu a že jste jsou nyní kódování na další úrovni, v rámci předchozí.Termín offside se používá k popisu stavu, ve kterém řádek kódu spustí konec konstrukt, protože není dostatečně daleko odsazený.Jinými slovy je offside kód offside řádku doleva.Správně odsazený kódu můžete využít offside pravidlo pro vymezují konec konstrukce.Odsazení použijete nesprávně, offside podmínka může způsobit kompilátor vydávat varování nebo může vést k nesprávné interpretaci kódu.

Offside řádky určeny.

  • = Token přidružený let zavádí offside řádku ve sloupci po první token = znak.

  • V if...then...else výraz, první token po umístění sloupce then klíčové slovo nebo else klíčové slovo zavádí offside řádku.

  • V try...with výraz, první token po try zavádí offside řádku.

  • V match výraz, první token po with a první token po každé -> zavést offside řádky.

  • První token po with v typu rozšíření zavádí offside řádku.

  • První token po levá složená závorka nebo závorka nebo po begin klíčové slovo, zavádí offside řádku.

  • První znak v klíčová slova let, if, a module zavést offside řádky.

Následující kód příklady ilustrují pravidla odsazení.Tiskové prohlášení zde spoléhat na odsazení přiřadit odpovídající kontext.Při každém Odsazení posune, kontextu je popped a vrátí předchozí kontextu.Proto je vytištěna mezera na konci každé opakování; "Hotovo!" je pouze vytisknout jednou, protože offside odsazení zjistí, že není součástí smyčky.Tisk řetězec "Nejvyšší úrovně kontextu" není součástí funkce.Proto tisku nejprve během inicializace statické před je zavolána funkce.

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]

Výstup je takto.

Top-level context

(Negative number) Zero 1 2 3 Done!

Po ukončení dlouhé řádky musí být dále než ohraničující konstrukce odsazen pokračování řádku.Argumenty musí být například odsazen dále než první znak názvu funkce, viz následující kód.

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

Existují výjimky z těchto pravidel, jak je popsáno v následující části.

Odsazení v modulech

Kód v modulu Místní musí být odsazen vzhledem k modulu, ale nemusí být odsazené kód v modulu nejvyšší úrovně.Prvky oboru názvů není nutné být odsazen.

Následující kód příklady 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

Další informace naleznete v tématu Moduly (F#).

Výjimky z pravidel základní odsazení

Obecné pravidlo popsaným v předchozí části je, že kód v víceřádkové konstrukce musí být odsazen vzhledem k odsazení prvního řádku konstruktu a že konec konstruktu je určena při prvním řádku offside.Výjimku z pravidla o při kontexty konec je, že některé konstrukce, jako například try...with výraz, if...then...else výraz a používání and syntaxe pro deklarování vzájemně rekurzivní funkce nebo typy, mají více částí.Například odsazení vyšší části then a else v if...then...else výraz ve stejné úrovni jako token, který spustí výraz, ale namísto označující ukončení kontextu představuje další část stejného kontextu.Proto if...then...else výraz lze zapsat jako v následujícím příkladu kódu.

let abs1 x =
    if (x >= 0)
    then
        x
    else
        -x

Výjimkou offside pravidla se týká pouze then a else klíčová slova.Proto Ačkoli není chyba odsazení then a else dále není-li odsadit řádky kódu v then bloku vytváří upozornění.Tento postup je znázorněn v následujících řádků kódu.

// 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

Kód v else bloku další zvláštní pravidlo platí.Upozornění v předcházejícím příkladu dochází pouze na kód v then blok, nikoli na kód v else bloku.To umožňuje napsat kód, který kontroluje bez vynucení zbývající kód funkce, které mohou být v různých podmínek na začátku funkce else bloku odsazení.Proto můžete napsat následující bez upozornění produkci.

let abs4 x =
    if (x >= 0) then x else
    -x

Jiné výjimkou pravidla, která kontexty ukončit, pokud není odsazený řádek předchozího řádku je pro zaváděcí operátory, například pokud jde + a |>.Řádky, které začínají zaváděcí operátory jsou oprávněni zahájit (1 + oplength) sloupce před obvyklé poloze, aniž by vyvolala zakončení kontext, kde oplength je počet znaků, které tvoří operátor.To způsobí, že první token za operátor zarovnat předchozího řádku.

Například v následujícím kódu + symbol může být odsazené dva sloupce než předchozí řádek.

let function1 arg1 arg2 arg3 arg4 =
    arg1 + arg2
  + arg3 + arg4

Odsazení se obvykle zvyšuje, jakmile vyšší úroveň vnoření, existují však několik konceptů, které umožňuje kompilátor obnovit odsazení dolní pozice sloupce.

Konstrukce, které umožňují obnovení pozice sloupce jsou následující:

  • Subjekty anonymní funkce.Následující kód začíná tisku výraz pozice sloupce, který je dále vlevo, než fun klíčové slovo.Však musí řádek nelze spustit ve sloupci vlevo od začátku předchozí úroveň odsazení (, nalevo od L v List).

    let printListWithOffset a list1 =
        List.iter (fun elem ->
            printfn "%d" (a + elem)) list1
    
  • Konstrukce Uzavřít závorkami nebo podle begin a end v then nebo else blokovat z if...then...else výraz, podle odsazení je méně než pozice sloupce if klíčové slovo.Tato výjimka umožňuje kódování stylu, v němž levá závorka nebo begin se používá na konci řádku po then nebo else.

  • Subjekty moduly, třídy, rozhraní a struktur, které jsou odděleny begin...end, {...}, class...end, nebo interface...end.To umožňuje styl, v němž klíčové slovo otevření definice typu může být na stejném řádku jako název typu bez vynucení celé tělo být odsazené dále než otevření klíčové slovo.

    type IMyInterface = interface
       abstract Function1: int -> int
    end
    

Viz také

Další zdroje

F# Language Reference