2016-10-19 3 views

ответ

5

PeopleCode проходит по ссылке для функций.

Function addOne(&num As integer)  
    &num = &num + 1 
End-Function; 

Local integer &val = 9; 
addOne(&val); 
MessageBox(0, "", 0, 0,String(&val)); 

Результаты в 10

Если вы используете классы App ведет себя по-разному методов:

  • Pass по значению для простых типов (строка, INT, числа и т.д.)
  • Передать по ссылке для объектов (ряды, записи, классы приложений)
  • Может проходить по ссылке для простых типов, используя OUT keywo й в списке параметров

    method addOne(&num as integer out)

1

Функции, которые определены в том же контексте в качестве исполняемого кода, например, page/component/record/field PeopleCode, всегда рассматривайте параметры как ссылки.

В классах приложений параметры простых типов методов могут быть определены с помощью ключевого слова «out», чтобы указать, что они являются ссылками. Методы также автоматически передают параметры как ссылки для сложных типов. Подумайте: «Если есть много данных, это ссылка»

1

Эта документация будет очень полезна для вас. https://docs.oracle.com/cd/E26239_01/pt851h3/eng/psbooks/tpcr/chapter.htm?File=tpcr/htm/tpcr07.htm

Попутный Параметры с типами данных Object

параметров с типами данных объекта всегда передаются по ссылке:

/* argument passed by reference */ 
method storeInfo(&f as File); 

Если указать из модификатора для параметра метода с объект тип данных, он становится ссылочным параметром. Это означает, что переменная параметра передается по ссылке вместо объекта, который указывает на момент передачи.

Например, если вы передать параметр объекта с выхода модификатора:

method myMethod(&arg as MyObjectClass); 

Local MyObjectClass &o1 = create MyObjectClass("A"); 
Local MyOtherObjectClass &o2 = create MyOtherObjectClass(); 

&o2.myMethod(&o1); 

And inside myMethod this occurs: 
Method myMethod 
    &arg = create MyObjectClass("B"); 
end-method; 

Поскольку метод аргумент переназначен в теле MyMethod, & o1 не указывает на новый экземпляр MyObjectClass (инициализируется с «B») после завершения вызова метода. Это потому, что & o1 еще ссылается на исходный экземпляр MyObjectClass.

Однако, если & o1 был принят с модификатором из, после завершения вызова метода, & o1 точки на то, что параметр был последним назначен; в этом случае новый экземпляр MyObjectClass.Параметр , а не объект, передается по ссылке. Использование Исходная спецификация для параметра

В следующем примере класс AddStuff имеет один общедоступный метод , DoAdd. Это добавляет два числа вместе, затем назначает их как разных номеров. В сигнатуре декларации метода первый параметр не объявлен с выводом out, а второй - .

class AddStuff 
    ​method DoAdd(&P1 as number, &P2 as number out); 
​end-class; 

method DoAdd 
    &X = &P1 + &P2; 
    &P1 = 1; 
    &P2 = 2; 
end-method; 

В следующем примере PeopleCode, объект с именем & Ареф является экземпляр из класса AddStuff. Два параметра, & I и & J - также определены.

local AddStuff &Aref = Create AddStuff(); 
local number &I = 10; 
local number &J = 20; 

Приведенный ниже пример кода. & J изменяется, из-за завышенности в сигнатуре метода, и потому что значение передано по ссылке. Значение & I не обновляется.

&Aref.DoAdd(&I, &J); /* changes &J but not &I */ 

Следующий пример кода вызывает ошибку времени проектирования. Второй параметр должен передаваться по ссылке, а не по значению.

&Aref.DoAdd(10, 20); /* error - second argument not variable */