with: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - ";[ ]+ " to "; ")
m (Some wiki formatting)
Line 15: Line 15:
|gr1= Program Flow
|gr1= Program Flow


|descr= Creates a [[With Type]] that is used inside a [[do]] construct in order to execute code inside a given namespace.  
|descr= Creates a [[With Type]] that is used inside a [[do]] construct in order to execute code inside a given namespace.
{{Feature | Warning | when used in a do-construct in scripts with allowed suspension, an unexpected namespace switch could happen (see note below)}}
{{Feature|important|To avoid the below-mentioned issue error (whether in [[Scheduler#Scheduled Environment|scheduled]] or [[Scheduler#Unscheduled Environment|unscheduled]] environment) use [[setVariable]]/[[getVariable]] with the desired [[Namespace]].}}
'''NOTE''' for the reasons unknown, namespace switching might unexpectedly occur inside some scopes ([[for]], [[if]], [[try]], [[call]]) started in [[Scheduler#Scheduled_Environment|scheduled]] scripts ([[canSuspend]] true) after small suspension if [[with]] was not the main scope. For example:  
 
|pr= When used in a do-construct in scripts with allowed suspension, a namespace switching might unexpectedly occur inside some scopes ([[for]], [[if]], [[try]], [[call]]) started in a [[Scheduler#Scheduled Environment|scheduled]] environment after small suspension if [[with]] was not the main scope; however, the issue does not arise if [[with]] is used in the parent scope:
{{{!}} class="wikitable"
! namespace switch risk
! namespace switch safe
{{!}}-
{{!}}
<code>[] [[spawn]]
<code>[] [[spawn]]
{
{
[[with]] [[uiNamespace]] do  
[[with]] [[uiNamespace]] [[do]]
{
{
[[for]] "_i" [[from]] 1 [[to]] 1 [[do]]  
[[for]] "_i" [[from]] 1 [[to]] 1 [[do]]  
Line 28: Line 34:
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
];
];
// result [true, false]
{{cc|result [true, false]}}
[[sleep]] 0.05; //<-- small suspension
[[sleep]] 0.05; {{cc|<-- small suspension}}
[[systemChat]] [[str]] [
[[systemChat]] [[str]] [
[[currentNamespace]] [[isEqualTo]] [[uiNamespace]],  
[[currentNamespace]] [[isEqualTo]] [[uiNamespace]],  
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
];
];
// result [false, true] <-- switching
{{cc|result [false, true] <-- switching}}
};
};
};
};
};</code>
};</code>
However if [[with]] used in parent scope, everything works correctly:
{{!}}
<code>[[with]] [[uiNamespace]] do
<code>[[with]] [[uiNamespace]] [[do]]
{
{
[] [[spawn]]  
[] [[spawn]]
{
{
[[for]] "_i" [[from]] 1 [[to]] 1 [[do]]  
[[for]] "_i" [[from]] 1 [[to]] 1 [[do]]  
Line 49: Line 55:
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
];
];
// result [true, false]
{{cc|result [true, false]}}
[[sleep]] 0.05; //<-- small suspension
[[sleep]] 0.05; {{cc|<-- small suspension}}
[[systemChat]] [[str]] [
[[systemChat]] [[str]] [
[[currentNamespace]] [[isEqualTo]] [[uiNamespace]],  
[[currentNamespace]] [[isEqualTo]] [[uiNamespace]],  
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
[[currentNamespace]] [[isEqualTo]] [[missionNamespace]]
];
];
// result [true, false] <-- NO switching
{{cc|result [true, false] <-- NO switching}}
};
};
};
};
};</code>
};</code>
To eliminate possibility of error you can also use [[setVariable]] or [[getVariable]] with desired [[Namespace]], which is also [[Scheduler#Scheduled_Environment|scheduled environment]] safe.
{{!}}}


|s1= [[with]] namespace
|s1= [[with]] namespace
Line 68: Line 74:


|x1= <code>_myWithType = [[with]] [[uiNamespace]];</code>
|x1= <code>_myWithType = [[with]] [[uiNamespace]];</code>
|x2= <code>[[with]] [[missionNamespace]] [[do]] {global = global + 1};</code>
|x2= <code>[[with]] [[missionNamespace]] [[do]] {global = global + 1};</code>


|seealso= [[ArmA:_Editing#Forward_Compatibility|Forward Compatibility]], [[missionNamespace]], [[uiNamespace]], [[parsingNamespace]]
|seealso= [[missionNamespace]], [[uiNamespace]], [[parsingNamespace]], [[currentNamespace]]
}}
}}

Revision as of 21:36, 23 August 2021

Hover & click on the images for description

Description

Description:
Creates a With Type that is used inside a do construct in order to execute code inside a given namespace.
To avoid the below-mentioned issue error (whether in scheduled or unscheduled environment) use setVariable/getVariable with the desired Namespace.
Problems:
When used in a do-construct in scripts with allowed suspension, a namespace switching might unexpectedly occur inside some scopes (for, if, try, call) started in a scheduled environment after small suspension if with was not the main scope; however, the issue does not arise if with is used in the parent scope:
namespace switch risk namespace switch safe

[] spawn { with uiNamespace do { for "_i" from 1 to 1 do { systemChat str [ currentNamespace isEqualTo uiNamespace, currentNamespace isEqualTo missionNamespace ]; // result [true, false] sleep 0.05; // <-- small suspension systemChat str [ currentNamespace isEqualTo uiNamespace, currentNamespace isEqualTo missionNamespace ]; // result [false, true] <-- switching }; }; };

with uiNamespace do { [] spawn { for "_i" from 1 to 1 do { systemChat str [ currentNamespace isEqualTo uiNamespace, currentNamespace isEqualTo missionNamespace ]; // result [true, false] sleep 0.05; // <-- small suspension systemChat str [ currentNamespace isEqualTo uiNamespace, currentNamespace isEqualTo missionNamespace ]; // result [true, false] <-- NO switching }; }; };

Groups:
Program Flow

Syntax

Syntax:
with namespace
Parameters:
namespace: Namespace
Return Value:
With Type

Examples

Example 1:
_myWithType = with uiNamespace;
Example 2:
with missionNamespace do {global = global + 1};

Additional Information

See also:
missionNamespaceuiNamespaceparsingNamespacecurrentNamespace

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note