Да, это так, и на самом деле похоже на C ++.(Но упрощение языка сценариев немного затеняет его.)
Я пытаюсь пролить некоторый свет на это:
Все объекты в DM (Image
, TagGroup
, Component
, ROI
, ImageDisplay
и т. Д.) Автоматически и всегда передаются по ссылке, а не по значению.
Это можно увидеть в следующем примере кода:
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
Фактическое изображение img
основного скрипта изменяется.Подпрограмма ModifyImage
получила и использовала ссылку на объект изображения.
Подсказка: Это очень типичный источник ошибок при работе с TagGroups
.Когда кто-то получает тег из изображения, а затем изменяет его в методе, он изменяет тег изображения!
Чтобы иметь методы not модифицировать предоставленные объекты параметров, переданные по ссылке, сначала нужно явно создать клон объекта.По этой причине все типы объектов в языках сценариев предоставляют команды ...clone()
.
void ModifyImage( image imgTemp )
{
imgTemp = irow
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img.ImageClone() )
Теперь переменная img
основного сценария не изменилась.(Поскольку мы создаем копию в памяти, а затем передаем ссылку на копию.)
Однако примитивные типы (string
, number
) по умолчанию передаются по значению, а не по ссылке.
Опять же, это можно увидеть на небольшом примере.
void ModifyString( string tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
Здесь переменная str
основного скрипта не изменяется на ModifyString
, поскольку значениябыл передан в tempStr
, а не в качестве ссылки.То же самое верно для переменных типа number
.
Если кто-то хочет передать примитивный тип по ссылке, это может быть обозначено &
в сигнатуре методов.
Пример выше теперь изменен:
void ModifyString( string &tempStr )
{
tempStr = "Changed"
}
string str = "Original"
Result("\n" + str )
OKDialog("Act!")
ModifyString( str )
Result(" --> " + str )
&
также может использоваться для непримитивных объектов в DM, если переданный указатель может быть изменен:
Вот пример для этого.Метод не изменяет предоставленное изображение, но создает новое и передает ссылку обратно в указатель.
void ModifyImage( image &imgTemp )
{
imgTemp := RealImage( "New Test" , 4, 200, 200 )
imgTemp = iradius
}
Image img := RealImage( "Test", 4, 100, 100 )
img = icol
img.ShowImage()
OKDialog("Act!")
ModifyImage( img )
img.ShowImage()
Наконец: оператор *
для обозначения указателей равен никогда не используется в DM-скриптинге.