Globális & helyi változó hozzárendelése

Néhány online oktatóanyagon keresztül tanulok shell parancsfájlokat, és eljutottam a következő szkripthez amely deklarálja a globális és lokális változók különbségeit.

#!/bin/bash # Experimenting with variable scope var_change () { local var1="local 1" echo Inside function: var1 is $var1 : var2 is $var2 var1="changed again" var2="changed again" } var1="global 1" var2="global 2" echo Before function call: var1 is $var1 : var2 is $var2 var_change echo After function call: var1 is $var1 : var2 is $var2 

És a kimenet:

A függvényhívás előtt: var1 globális 1 : var2 globális 2

Belső függvény: var1 helyi 1 : var2 globális 2

A függvényhívás után: var1 global 1 : a var2 ismét megváltozott

Kérdésem …

Miért van a var1 után a " global 1 függvényhívás " a " helyett ismét megváltozott "? Valaki megmagyarázná?

Válasz

var1 a függvény lokálissá nyilvánítva. Tehát a függvény végrehajtása során két változó van, var1 néven: a globális és a helyi; de a függvény csak “láthatja” a lokálisat (a helyi “árnyékolja” a globálisat). Tehát a függvényen belül bármi, amit a var1 érdekében tesz, a helyi változóval történik; a globális var1 egyáltalán nem érinti.

Válasz

Az egyik út gondoljunk csak arra, hogy elképzeljük, hogy a local var1="local 1" megtakarítja a var1 jelenlegi értékét, azzal az ígérettel, hogy a azt a funkciót, amelyet visszaállít, majd "local 1" értékre állítja. Ezzel a mentális modellel az összes változó globálisnak tekinthető, és a változók a függvények végén helyreállíthatók.

A példa jobb lett volna, ha ahelyett, hogy visszhangot hívna a függvényen belül és kívül is, hívott egy másik függvényt, amely var -et adott ki.

bash$ show(){ printf " The value of %s in %s is "%s"\n" $1 $2 ${!1} ; } bash$ bar(){ show v1 bar_$1 ; } bash$ foo(){ show v1 before_foo ; local v1 ; show v1 after_local ; \ v1="changed"; show v1 after_change ; bar via_foo ; } bash$ v1="global" bash$ show v1 global_scope The value of v1 in global_scope is "global" bash$ foo The value of v1 in before_foo is "global" The value of v1 in after_local is "" The value of v1 in after_change is "changed" The value of v1 in bar_via_foo is "changed" bash$ bar direct The value of v1 in bar_direct is "global" bash$ show v1 global_scope The value of v1 in global_scope is "global" 

Itt láthatja a sávon belüli hívásban a foo belül felveszi a foo által létrehozott v1 értékét.

A dynamic scope vs lexical scope keresése segíthet.

Megjegyzések

  • " A függvény végén visszaállít ", ez egyértelművé teszi az elmémet! Köszönet

Válasz

A Bash-ban a helyi változókat kifejezetten meg kell hívni, különben globálisként kezelik őket . Még a függvények belsejében is (ahol a hatókör érvényes).

És bármilyen hatókört állítottak be utoljára egy változóra – akár helyi, akár a local vagy globális kihagyás révén – az lesz az, ami visszaadódik abban az időben, amikor a echo keresztül hívják.

Tehát, Például a függvény meghívása után a helyi hatókört a var1 értékre állítja be, így ennek a változónak a változása nem marad meg a függvényen kívül. De a globális állapot a var2 állapotban marad, ezért ennek a változónak a változásai igen.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük