Difference between revisions of "LSL 101/Variable Initialization"

From Second Life Wiki
Jump to navigation Jump to search
Line 31: Line 31:
<lsl> string WelcomePhrase = "Welcome to " + RegionName  + ".";</lsl>
<lsl> string WelcomePhrase = "Welcome to " + RegionName  + ".";</lsl>


It looks as though we have combined the variable declaration and the assignment statement into one statement, and in effect, that is what we have doneAny declaration of a local variable can be followed by the assignment symbol and an expression that follows the same rules as that for an assignment statement. As a matter of fact, this is generally considered a good practice, and most example you see will probably do that.
The first version allocates the variable and initializes it with the string containing no characters (written as "")Then, it updates the variable with the string "Welcome to Ganymede.".


However, the rules for initializing a ''global'' variable are different.
The second version both declares the variable and initializes it with the value "Welcome to Ganymede." in the same statement.  The syntax for this is easy to remember because it is written as though the declaration and assignment statements were rolled into one.  But keep in mind that this is not simply another form of an assignment statement.  For example, the following code fragment is '''not''' legal.
 
<lsl> string WelcomePhrase = "Welcome to " + RegionName;
string WelcomePhrase = WelcomePhrase + ".";</lsl>
 
It is not legal because the second statement is an attempt to declare a variable that already exists, and isn't allowed.
 
Any declaration of a local variable can be followed by the assignment symbol and an initialization expression that follows the same form as an assignment statement.  As a matter of fact, providing an initial value is generally considered a good practice, and most example you see will probably do that.
 
However, the rules for initializing a ''global'' variable are different.  Global variables can have a initializer, but it can only be a simple value.  It can't be the result of a built-in function and can't have any operators.  This, we could '''not''' change our global variable declaration to
 
<lsl>string RegionName = llGetRegionName();    // This is a global variable</lsl>
 
On the other hand, we could do this:
 
<lsl>string RegionName = "Region not known";    // This is a global variable</lsl>
 
Initializing global variables to a unique value like this has an advantage over letting it be compiled with the empty string.  When testing your script, if the phrase "Region not known" appears in the output where you expected a region name, you'll immediately know that no assignment to that variable was ever executed.  If, on the other hand, the region name was simply missing (i.e. the empty string), it might be less obvious where things went wrong.

Revision as of 20:57, 2 June 2009

← Global vs Local Variables ↑̲  LSL 101  ̲↑ Event Handler Parameters →

When a variable declaration is executed, the variable always gets some initial value, whether or not our script specifies. This is called variable initialization, and it deserves a little discussion of its own. So far, we have passed over this detail by always executing an assignment statement for the variable prior to using it. But consider this example.

<lsl>string RegionName; // This is a global variable

default {

    state_entry()
    {
         // Store the name of the current sim for later use
         RegionName = llGetRegionName();
    }

    touch_start( integer num_detected )
    {
         // Announce the region where the script is running
         string WelcomePhrase = "Welcome to " + RegionName  + ".";
         llOwnerSay( WelcomePhrase );
    }

}</lsl>

The only difference between the previous example and this one is that we have replaced the two lines

<lsl> string WelcomePhrase

WelcomePhrase = "Welcome to " + RegionName  + ".";</lsl>

with the single line

<lsl> string WelcomePhrase = "Welcome to " + RegionName + ".";</lsl>

The first version allocates the variable and initializes it with the string containing no characters (written as ""). Then, it updates the variable with the string "Welcome to Ganymede.".

The second version both declares the variable and initializes it with the value "Welcome to Ganymede." in the same statement. The syntax for this is easy to remember because it is written as though the declaration and assignment statements were rolled into one. But keep in mind that this is not simply another form of an assignment statement. For example, the following code fragment is not legal.

<lsl> string WelcomePhrase = "Welcome to " + RegionName;

string WelcomePhrase = WelcomePhrase + ".";</lsl>

It is not legal because the second statement is an attempt to declare a variable that already exists, and isn't allowed.

Any declaration of a local variable can be followed by the assignment symbol and an initialization expression that follows the same form as an assignment statement. As a matter of fact, providing an initial value is generally considered a good practice, and most example you see will probably do that.

However, the rules for initializing a global variable are different. Global variables can have a initializer, but it can only be a simple value. It can't be the result of a built-in function and can't have any operators. This, we could not change our global variable declaration to

<lsl>string RegionName = llGetRegionName(); // This is a global variable</lsl>

On the other hand, we could do this:

<lsl>string RegionName = "Region not known"; // This is a global variable</lsl>

Initializing global variables to a unique value like this has an advantage over letting it be compiled with the empty string. When testing your script, if the phrase "Region not known" appears in the output where you expected a region name, you'll immediately know that no assignment to that variable was ever executed. If, on the other hand, the region name was simply missing (i.e. the empty string), it might be less obvious where things went wrong.