Objetos
Um objeto é um "pacote" que agrupa dados e/ou funções, usualmente (sempre?) atribuído a uma palavra (variável). Para acessar um atributo de um objeto em Red, nós usamos a barra (/) como separador. Isto é pouco usual, pois a maoria das linguagens usa um ponto mas, depois que você se acostuma, me parece mais intuitivo já similar a um path (caminho).
Criando um objeto:
action! make object! , function! context and function! object
Você pode usar make object! , object ou context para criar um objeto. Eles são o mesmo comando. object e context são só simplificações de make object!.
Red []
myobject: object [
x: 10
y: 20
f: function [a b] [a + b]
name: none
tel: none
]
myobject/name: "Dimitri"
myobject/tel: #3333-3333
print myobject/x
print myobject/y
print myobject/f 3 5
print myobject/name
print myobject/tel
10
20
8
Dimitri
3333-3333
A computação é feita apenas quando você cria um object! (é o constructor). Note que o comando print no código abaixo não é executado quando o objeto é acessado:
>> myobject: object [print "hello" a: 1 b: 2]
hello
== make object! [
a: 1
b: 2
]
>> myobject/a
== 1
Auto-referência:
Quando um objeto precisa fazer uma referência a si próprio, usamos a palavra self :
Red []
myobject: object [
x: 10
y: 20
f: function [a b] [a + b]
autoanalisys: does [print self]
]
myobject/autoanalisys
x: 10
y: 20
f: func [a b][a + b]
autoanalisys: func [][print self]
Clonando um objeto e inheritance (herança):
Simplesmente atribui um objeto a outro apenas cria um vinculo aos mesmos dados. Se o primeiro muda, o segundo muda também:
>> a: object [x: 10] ;lines of the console deleted for the sake of clarity.
>> b: a ;lines of the console deleted for the sake of clarity.
>> a/x: 20
== 20
>> b/x
== 20 ;changed too!
Para fazer uma cópia verdadeira e independente, use copy:
>> a: object [x: 10] ;lines of the console deleted for the sake of clarity.
>> b: copy a ;lines of the console deleted for the sake of clarity.
>> a/x: 20
== 20
>> b/x
== 10 ;NO change! b is a true copy.
Se quisermos criar um objeto que herde (inherits) o primeiro objeto, nós usamos make <original object> <new specifications>:
Red []
a: object [x: 3]
b: make a [y: 12]
print b
x: 3
y: 12
find e select - para objetos
find simplemente checa se o campo existe, retornando true ou none .
select faz a mesma coisa, mas se o campo existe, retorna seu valor.
Red []
obj: object [a: 44]
print find obj 'a
print select obj 'a
print find obj 'x
print select obj 'something
true
44
none
none
Note que ambos buscam a palavra (indicado pelo símbolo ' antes), não pela própria variável. Para acessar a variável, se usa um simples path como obj/a.