Zoeken…


Syntaxis

  • set varName ? waarde?
  • uitgeschakeld? -Niet klagen ? ? -? ? varName varName varName ?
  • zet $ varName
  • zet [set varName ]
  • variabele varName
  • globale varName ? varName varName ?

Opmerkingen

  • Parameters ingesloten binnen ? ...? zoals ? varName? vertegenwoordigen optionele argumenten voor een Tcl-opdracht.
  • Documentatie: wereldwijd , upvar

Waarden toewijzen aan variabelen

De opdracht set wordt gebruikt voor het toewijzen waarden in Tcl. Wanneer het met twee argumenten op de volgende manier wordt aangeroepen,

% set tempVar "This is a string."
This is a string.

het plaatst het tweede argument ("Dit is een string") in de geheugenruimte waarnaar wordt verwezen door het eerste argument (tempVar). set retourneert altijd de inhoud van de variabele die in het eerste argument wordt genoemd. In het bovenstaande voorbeeld retourneert set 'Dit is een tekenreeks'. zonder de aanhalingstekens.

  • Als waarde wordt opgegeven, wordt de inhoud van de variabele varName gelijk aan waarde ingesteld .
  • Als varName alleen uit alfanumerieke tekens bestaat en geen haakjes, is het een scalaire variabele.
  • Als varName de vorm varName (index) heeft , is deze lid van een associatieve array.

Merk op dat de naam van de variabele niet is beperkt tot het Latijnse alfabet, deze kan bestaan uit elke combinatie van unicode-tekens (bijvoorbeeld Armeens):

% set տուն house
house
% puts ${տուն}
house

scoping

set alpha 1

proc myproc {} {
    puts $alpha
}

myproc

Deze code werkt niet omdat de twee alfa's zich in verschillende bereiken bevinden.

De opdrachtset set alpha 1 maakt een variabele in het globale bereik (waardoor het een globale variabele wordt).

De opdracht puts $alpha wordt uitgevoerd in een bereik dat wordt gemaakt wanneer de opdracht myproc uitgevoerd.

De twee scopes zijn verschillend. Dit betekent dat wanneer puts $alpha probeert de naam alpha , deze variabele niet wordt gevonden.

We kunnen dat echter oplossen:

proc myproc {} {
    global alpha beta
    puts $alpha
}

In dit geval zijn twee globale variabelen, alpha en beta , gekoppeld aan aliasvariabelen (met dezelfde naam) in het bereik van de procedure. Lezen van de aliasvariabelen haalt de waarde op in de globale variabelen en schrijven naar hen wijzigt de waarden in de globalen.

Meer in het algemeen maakt de opdracht upvar aliassen naar variabelen van een van de vorige scopes. Het kan worden gebruikt met de globale scope ( #0 ):

proc myproc {} {
    upvar #0 alpha alpha beta b
    puts $alpha
}

De aliassen kunnen dezelfde naam krijgen als de variabele die is gekoppeld aan ( alpha ) of een andere naam ( beta / b ).

Als we myproc vanuit de wereldwijde scope aanroepen, werkt deze variant ook:

proc myproc {} {
    upvar 1 alpha alpha beta b
    puts $alpha
}

Het bereik nummer 1 betekent "het vorige bereik" of "het bereik van de beller".

Tenzij je echt weet wat je doet, zijn #0 , 0 en 1 de enige scopes die logisch zijn om te gebruiken met upvar . ( upvar 0 maakt een lokale alias voor een lokale variabele, niet strikt een scopingbewerking.)

Sommige andere talen definiëren het bereik door accolades en laten code die in elk bereik wordt uitgevoerd alle namen in omringende bereiken zien. In Tcl wordt een enkele scope gemaakt wanneer een procedure wordt aangeroepen en zijn alleen de eigen namen zichtbaar. Als een procedure een andere procedure aanroept, wordt het bereik ervan bovenop het vorige bereik gestapeld, enzovoort. Dit betekent dat in tegenstelling tot C-stijltalen die alleen een globaal bereik en een lokaal bereik (met subscopen) hebben, elk bereik fungeert als een omsluitend (hoewel niet onmiddellijk zichtbaar) bereik voor elk bereik dat het heeft geopend. Wanneer een procedure terugkeert, wordt de reikwijdte ervan vernietigd.

Documentatie: wereldwijd , upvar

De waarde van een variabele afdrukken

Om de waarde van een variabele af te drukken, zoals,

set tempVar "This is a string."

Het argument in de put-instructie wordt voorafgegaan door een $ -teken, dat Tcl vertelt de waarde van de variabele te gebruiken.

% set tempVar "This is a string."
This is a string.
% puts $tempVar
This is a string.

Oproepset met één argument

set kan ook worden opgeroepen met slechts één argument. Wanneer het met slechts één argument wordt aangeroepen, retourneert het de inhoud van dat argument.

% set x 235
235
% set x
235

Variabele / s verwijderen

De opdracht unset wordt gebruikt om een of meer variabelen te verwijderen.

unset ?-nocomplain? ?--? ?name name name name?
  • Elke naam is een variabelenaam die is opgegeven op een van de manieren die aanvaardbaar zijn voor de opdracht set .
  • Als een naam verwijst naar een element van een array, wordt dat element verwijderd zonder de rest van de array te beïnvloeden.
  • Als een naam bestaat uit een arraynaam zonder index tussen haakjes, wordt de hele array verwijderd.
  • Als -nocomplain als het eerste argument wordt gegeven, worden alle mogelijke fouten uit de uitvoer van de opdracht onderdrukt.
  • De optie - geeft het einde van de opties aan en moet worden gebruikt als u een variabele met dezelfde naam als een van de opties wilt verwijderen.
% set x 235
235
% set x
235
% unset x
% set x
can't read "x": no such variable

Naamruimte variabelen

De variable opdracht zorgt ervoor dat een bepaalde naamruimtevariabele wordt gemaakt. Totdat er een waarde aan is toegewezen, is de waarde van de variabele niet gedefinieerd:

namespace eval mynamespace {
    variable alpha
    set alpha 0
}

De variabele is toegankelijk van buiten de naamruimte (eigenlijk overal) door de naam van de naamruimte eraan te koppelen:

set ::mynamespace::alpha

Toegang kan binnen een procedure worden vereenvoudigd door het variable commando opnieuw te gebruiken:

proc ::mynamespace::myproc {} {
    variable alpha
    set alpha
}

Hiermee maakt u een lokale alias voor de naamruimtevariabele.

Voor een procedure die is gedefinieerd in een andere naamruimte, moet de variabelenaam de naamruimte bevatten in de aanroep van variable :

proc myproc {} {
    variable ::mynamespace::alpha
    set alpha
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow