Pular para o conteúdo

Instrução With

Um padrão comum envolvendo a criação de um objeto é chamar uma série de funções e definir uma série de propriedades imediatamente após criá-lo.

Isso resulta em repetir o nome do objeto várias vezes no código, adicionando ruído desnecessário. Uma solução comum para isso é passar uma tabela como argumento que contém uma coleção de chaves e valores para sobrescrever. O inconveniente é que o construtor desse objeto deve suportar essa forma.

O bloco with ajuda a aliviar isso. Dentro de um bloco with podemos usar instruções especiais que começam com . ou \ que representam essas operações aplicadas ao objeto com o qual estamos usando with.

Por exemplo, trabalhamos com um objeto recém-criado:

with Person!
.name = "Oswald"
\add_relative my_dad
\save!
print .name

A instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso.

file = with File "favorite_foods.txt"
\set_encoding "utf8"

Expressões with suportam break com um valor:

result = with obj
break .value

Depois que break value é usado dentro de with, a expressão with deixa de retornar seu objeto-alvo e passa a retornar o valor de break.

a = with obj
.x = 1
-- a é obj
b = with obj
break .x
-- b é .x, não obj

Diferente de for / while / repeat / do, with suporta apenas um valor de break.

Ou…

create_person = (name, relatives) ->
with Person!
.name = name
\add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]

Neste uso, with pode ser visto como uma forma especial do combinador K.

A expressão na instrução with também pode ser uma atribuição, se você quiser dar um nome à expressão.

with str := "Hello"
print "original:", str
print "upper:", \upper!

Você pode acessar chaves especiais com [] em uma instrução with.

with tb
[1] = 1
print [2]
with [abc]
[3] = [2]\func!
["key-name"] = value
[] = "abc" -- anexando a "tb"

with? é uma versão aprimorada da sintaxe with, que introduz uma verificação existencial para acessar com segurança objetos que podem ser nil sem verificações explícitas de null.

with? obj
print .name

YueScriptCompilador

Carregando compilador…