Yleinen & paikallisen muuttujan määritys

Oppin komentosarjakomentoja joidenkin verkko-opetusohjelmien kautta ja tulin seuraavaan komentosarjaan joka ilmoittaa globaalien ja paikallisten muuttujien erot.

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

Ja tulos on:

Ennen funktion kutsua: var1 on globaali 1 : var2 on globaali 2

Sisäinen toiminto: var1 on paikallinen 1 : var2 on globaali 2

Funktion kutsun jälkeen: var1 on global 1 : var2 on muuttunut uudelleen

Kysymykseni …

Miksi var1 on jäljessä funktion kutsu " global 1 " muuttui uudelleen " sijasta "? Voiko joku selittää?

Vastaus

var1 julistetaan funktiossa paikalliseksi. Joten toiminnon suorittamisen aikana on kaksi muuttujaa nimeltä var1: globaali ja paikallinen; mutta funktio voi vain ”nähdä” paikallisen (paikallinen ”varjostaa” globaalia). Joten kaikki toiminnot, jotka teet var1 -toiminnolle, tehdään paikalliselle muuttujalle; globaalia var1 ei kosketa ollenkaan.

Vastaa

Yksi tapa ajatella sitä on kuvitella, että local var1="local 1" säästää nykyisen arvon var1, lupauksella, että toiminto, jonka se palautetaan, ja asettamalla sen arvoksi "local 1". Tämän mentaalimallin avulla voit sitten ajatella kaikkia muuttujia globaaleina ja muuttujia palautettaviksi toimintojen lopussa.

Esimerkki olisi ollut parempi, jos sen sijaan, että kutsuisi kaiun sekä toiminnon sisällä että sen ulkopuolella. kutsui toisen funktion, joka oli antanut var.

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" 

Täällä näet puhelupalkkiin kutsun sisältä foo poimii foo: n määrittämän v1: n arvon.

Verkkohaku haulle dynamic scope vs lexical scope voi auttaa.

Kommentit

  • " Funktion lopussa se palautetaan ", mikä tekee mielestäni selvän! Kiitos

vastaus

Bashissa paikalliset muuttujat on kutsuttava nimenomaisesti, muuten niitä kohdellaan globaaleina . Jopa toimintojen sisällä (missä soveltamisalaa sovelletaan).

Ja mikä tahansa laajuus viimeksi asetettiin muuttujalle – joko paikallinen, sanan local tai globaali laiminlyönnillä – on se, mitä palautetaan sinä aikana, kun sitä kutsutaan kautta echo.

Joten, esimerkkisi, kun funktio on kutsuttu, paikallinen laajuus asetetaan arvoon var1, joten muutokset tähän muuttujaan eivät pysy toiminnon ulkopuolella. Mutta globaali pysyy asetettuna arvoon var2, joten muutokset tähän muuttujaan vaikuttavat.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *