Pular para o conteúdo

Parâmetros Flexíveis

Nesta página

Declarar um valor padrão para um parâmetro torna a chamada opcional naquele argumento. O valor é avaliado a cada chamada que omite o argumento, por isso expressões dinâmicas funcionam corretamente:

Parâmetro único com padrão, múltiplos padrões e método com padrão em impl.

03-default-params.zolo
Playground
// Feature: Parameters with default values

// Syntax: `fn f(p: T = expr)` — caller may omit them.

// When to use: ergonomic API with optional config, avoid

// overloads and intermediate constructors.


// One default parameter at the end.

fn greet(name: str = "World") -> str {
  return "Hello, {name}!"
}

print(greet())  // Hello, World!

print(greet("Zolo"))  // Hello, Zolo!


// Multiple defaults — all positional.

fn connect(host: str = "localhost", port: int = 8080) -> str {
  return "{host}:{port}"
}

print(connect())  // localhost:8080

print(connect("api.example.com"))  // api.example.com:8080

print(connect("api.example.com", 443))  // api.example.com:443


// A default may use an expression — it is evaluated on EVERY

// call that omits the argument.

fn label(prefix: str, n: int = 0) -> str {
  return "{prefix}-{n}"
}

print(label("item"))  // item-0

print(label("item", 7))  // item-7


// Methods accept defaults too.

struct Counter {
  value: int,
}

impl Counter {
  fn new() -> Counter {
    return Counter { value: 0 }
  }

  fn add(self, n: int = 1) -> int {
    self.value = self.value + n
    return self.value
  }
}

let c = Counter::new()
print(c.add())  // 1

print(c.add())  // 2

print(c.add(10))  // 12

Varargs (args: ...T) permitem receber qualquer número de argumentos do mesmo tipo. Dentro da função, o parâmetro se comporta como um array normal — iterável com for ou indexável:

sum, log com nível fixo + partes variáveis, max_of e join_csv.

04-varargs.zolo
Playground
// Feature: Varargs (variadic parameters)

// Syntax: `fn f(args: ...T)` — `...` before the type.

// When to use: accept N arguments of the same type, in

// `printf` or `Array.of` style — without wrapping in a literal.


use std::Array

// Sum N integers.

fn sum(nums: ...int) -> int {
  var total = 0
  for n in nums {
    total += n
  }
  return total
}

print(sum())  // 0

print(sum(1))  // 1

print(sum(1, 2, 3))  // 6

print(sum(1, 2, 3, 4, 5, 6, 7))  // 28


// You can mix normal params before the vararg.

fn log(level: str, parts: ...str) {
  var buf = "[{level}] "
  for p in parts {
    buf = buf + p + " "
  }
  print(buf)
}

log("info", "user", "logged", "in")

// expected: [info] user logged in


// Inside the function, `nums` is a regular array.

fn max_of(xs: ...int) -> int {
  var hi = xs[0]
  for x in xs {
    if x > hi { hi = x }
  }
  return hi
}

print(max_of(3, 1, 4, 1, 5, 9, 2, 6))  // 9


// Varargs with strings: common in loggers and formatters.

fn join_csv(items: ...str) -> str {
  var out = ""
  var first = true
  for it in items {
    if !first { out = out + "," }
    out = out + it
    first = false
  }
  return out
}

print(join_csv("a", "b", "c"))  // a,b,c

Desafio

Combine os dois recursos: escreva repeat(msg: str, n: int = 3) que imprime msg exatamente n vezes. Chame sem o segundo argumento e depois com 5.

Veja também

Buscar no Zolo

9 resultados

enespt-br