Saltar para o conteúdo principal
Versão: 21 R4 BETA

Collection

Coleções são listas ordenadas de valores de tipos diferentes ou não (texto, número, objeto, booleano, coleção ou null).

Variáveis do tipo de coleção são gerenciadas usando notação do objeto.

Para acessar a um elemento de coleção, é necessário passar o número do elemento dentro de parênteses rectos:

collectionRef[expression]

Você pode passar qualquer expressão 4D válida que retorne um inteiro positivo em expressão. Exemplos:

myCollection[5] //access ao sexto elemento da coleção
myCollection[$var]

Warning: Os elementos da coleção são numerados a partir de 0.

Pode atribuir um valor a um elemento da coleção ou obter o valor de um elemento da coleção utilizando a notação de objetos:

myCol[10]:="My new element"
$myVar:=myCol[0]

Se atribuir um índice de elemento que ultrapasse o último elemento existente da coleção, a coleção se redimensiona automaticamente e a todos os novos elementos intermediários se lhes atribui um valor nulo:

var myCol : Collection
myCol:=New collection("A";"B")
myCol[5]:="Z"
//myCol[2]=null
//myCol[3]=null
//myCol[4]=null

Instanciação

As coleções devem ter sido inicializadas, por exemplo utilizando o comando New collection, do contrário ao tentar ler ou modificar seus elementos se gerará um erro de sintaxe.

A instanciação da colecção pode ser feita de uma das seguintes formas:

info

Vários comandos 4D e coleções de retorno de funções, por exemplo Monitored activity ou collection.copy. Neste caso, não é necessário instanciar explicitamente a coleção, a linguagem 4D fá-lo por si.

Comando New object

O comando Nova coleção cria uma nova coleção vazia ou pré-preenchida e retorna sua referência.

Exemplos:

var $colVar : Collection //declaração de uma variável 4D do tipo coleção
$colVar:=New collection //instanciação da coleção e atribuição à variável 4D

var $colFilled : Collection
$colFilled:=New collection("a"; "b";1;42;{}) //instanciação e atribuição de uma coleção pré-preenchida

Operador []

O operador [] permite que você crie um literal da coleção. Um literal de coleção é uma lista de zero ou mais expressões, cada um dos quais representa um elemento de coleção, entre colchetes quadrados ([]). Quando cria uma coleção utilizando um literal de coleção, esta é instanciada com os valores especificados como seus elementos e o seu comprimento é definido para o número de argumentos especificados.

Como qualquer elemento é considerado uma expressão, você pode criar subcoleções usando [] em elementos. Você também pode criar e fazer referência literais de objeto.

Se um elemento for indefinido, aparecerá como Nulo na coleção.

Exemplos:

var $col1; $col2; $users : Collection
$col1:=[] //colecção vazia
$col2:=[1;2;3;4;5;6] //colecção de números
//colecção de objectos
$users:=[{name: "Alice"; \
height: 183; \
eyecolor: "hazel"; \
id: $col2[5]\
}; \
{name: "Bob"; \
height: 172; \
eyecolor: "blue"\
}]
nota

Se você criar um literal de coleção contendo um único elemento, certifique-se de não usar um nome que corresponda a um nome de tabela existente, caso contrário, a sintaxe de tabela [tableName] terá prioridade.

Coleção regular ou partilhada

Pode criar dois tipos de coleções:

  • coleções regulares (não compartilhadas), usando o comando New collection ou a sintaxe literal da coleção ([]). Essas coleções podem ser editadas sem qualquer controle de acesso específico mas não podem ser compartilhadas entre processos.
  • coleções compartilhadas, usando o comando New shared collection. Essas coleções podem ser partilhadas entre processos, incluindo threads preemptivos. O acesso a essas coleções é controlado pelas estruturas Use...End use.

Para obter mais informações, consulte a seção Objetos e coleções compartilhados.

Assignment

Collection and object data types are handled in the 4D language through references (i.e., internal pointers), unlike scalar data types (integer, date, etc.). As a result, when assigning a collection to a variable (e.g. $myVar:=[1;2;3]), it is the reference that is assigned, not the value itself. Any subsequent modification of the $myVar variable will therefore be reflected everywhere the original collection is referenced. This follows the same principle as pointers, except that the $myVar variable does not need to be dereferenced.

Por exemplo:

var $col1; $col2 : Collection
var $o : Object

$col1:=[1;2;3] //a reference to the collection is created
$col2:=$col1 //both variables share the same collection reference
$o:={ list:$col1 } //the object stores a reference to the same collection

$col1.push(4)
//$col2 = [1,2,3,4]
//$o = {"list":[1,2,3,4]}

$col2[0]:=10
//$col1 = [10,2,3,4]
//$o = {"list":[10,2,3,4]}

$o.list.push(5)
//$col1 = [10,2,3,4,5]
//$col2 = [10,2,3,4,5]

ASSERT($col1=$col2) //True

This principle applies wherever objects or collections are assigned, including in parameters or formula expressions.

nota

If you want to create a deep copy of a collection, use the collection.copy() function.

Funções de Collection

As referências de coleções 4D se beneficiam de funções de classe especiais (às vezes denominadas funções de membro). As funções da coleção estão listadas na seção Referência de API de classe

Por exemplo:

$newCol:=$col.copy() //cópia de $col a $newCol
$col.push(10;100) //adiciona 10 e 100 para a coleção

Alguns métodos retornam a coleção original depois de moficiação, para que possa rodar as chamadas em sequência:

$col:=New collection(5;20)
$col2:=$col.push(10;100).sort() //$col2=[5,10,20,100]

parâmetro propertyPath

Várias funções aceitam um propriedadePath como parâmetro. Este parâmetro significa:

  • um nome de objeto propriedade por exemplo "Sobrenome"
  • ou uma rota de propriedades de objeto, ou seja, uma sequência hierárquica de subpropriedades vinculadas com caracteres de ponto, por exemplo "empregado.filhos.nome".

Aviso: Ao usar funções e parâmetros propertyPath, você não pode usar ".", "[ ]" ou espaços nos nomes das propriedades, pois isso impedirá que 4D analise corretamente o caminho:

$vmin:=$col.min("My.special.property") //indefinido
$vmin:=$col.min(["My.special.property"]) //erro

Operadores em coleções

É possível usar operadores de comparação com referências de coleção, o que significa que você pode avaliar se duas ou mais referências apontam para a mesma instância de uma coleção.

var $c1:=["a";42] //referência a uma instância
var $c2:=["a";42] //referência a uma instância diferente
var $c3:=$c1 //referência à mesma instância

Based upon the code above, the comparison table is:

OperaçãoSintaxeRetornaExpressionValor
IgualcollectionRef = collectionRefParâmetros$c1 = $c3True
$c1 = $c2False
DesigualdadecollectionRef # collectionRefParâmetros$c1 # $c3False
$c1 # $c2True

Indefinido

A leitura da propriedade length de uma coleção indefinida produz 0:

var $c : Collection //variável criada, mas nenhuma coleção foi definida
$size:=$c.length //$size = 0

Type conversions between collections and 4D arrays

When moving values between arrays (typed) and collections (non-typed), 4D applies automatic conversions according to the values and the array type declarations.

Converting collections to arrays

The following conversions are applied to values handled by the following commands:

Collection element typenullbooleanInfinityrealstringdatepictureobjectcollection4D.BLOB
ARRAY TEXT"""false" or "true""Infinity"number with dot separator (if necessary)TextConversion of date in text according to Dates inside objects parameter"[object Object]""[object Object]"Collection elements separated by ,"[object Object]"
ARRAY LONGINT00 or 1not defined behaviorrounded according to standard rounding rules0 if string does not start with [0-9,+,-,e,.,x], otherwise standard conversion. Supports hexa notation prefix 0x00000
ARRAY REAL00 or 1INFrealsame as ARRAY LONGINT00000
ARRAY INTEGER00 or 10rounded according to std rounding rulessame as ARRAY LONGINT00000
ARRAY BOOLEANFalsefalse or truetruetrue if #0true if string#""true if date#"00/00/00"TrueTrueTrueTrue
ARRAY OBJECTindefinidoindefinidoindefinidoindefinidoindefinidoindefinidoObject pictureObjectIndefinido4D. Blob
ARRAY BLOB0 bytes0 bytes0 bytes0 bytes0 bytes0 bytes0 bytes0 bytes0 bytesBlob
ARRAY PICTURE0 bytes0 bytes0 bytes0 bytes0 bytes0 bytesImagem0 bytes0 bytes0 bytes
ARRAY DATE00/00/0000/00/0000/00/0000/00/0000/00/00 or a date if ISO8601 compliant formatdate00/00/0000/00/0000/00/0000/00/00
ARRAY TIME00:00:0000:00:00not defined behaviornumber of seconds in 00:00:00 formatnumber of seconds in 00:00:00 format00:00:0000:00:0000:00:0000:00:0000:00:00
nota

Blob objects (4D.Blob) are automatically converted to scalar blobs and vice versa when necessary.

Converting arrays to collections

The following conversions are applied to values handled by the following commands:

ARRAY TEXTARRAY LONGINTARRAY REALARRAY INTEGERARRAY BOOLEANARRAY OBJECTARRAY PICTUREARRAY DATEARRAY TIMEARRAY BLOB
Collection element typesstringnumbernumbernumberbooleanobject or nullpicturestring or date according to the Dates inside objects parameternumber of seconds4D. Blob