Skip to content

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:

yuescript
with Person!
  .name = "Oswald"
  \add_relative my_dad
  \save!
  print .name
yue
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.

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

Ou…

yuescript
create_person = (name,  relatives) ->
  with Person!
    .name = name
    \add_relative relative for relative in *relatives

me = create_person "Leaf", [dad, mother, sister]
yue
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.

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

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

yuescript
with tb
  [1] = 1
  print [2]
  with [abc]
    [3] = [2]\func!
    ["key-name"] = value
  [] = "abc" -- anexando a "tb"
yue
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.

yuescript
with? obj
  print obj.name
yue
with? obj
  print obj.name