typestar

Galería de figuras en Mojo

Un trait, tres figuras y una sola función genérica que las tabula todas.

from std.math import pi, sqrt


trait Shape:
    def name(self) -> String:
        ...

    def area(self) -> Float64:
        ...


@fieldwise_init
struct Circle(ImplicitlyCopyable, Movable, Shape):
    var radius: Float64

    def name(self) -> String:
        return "circle"

    def area(self) -> Float64:
        return pi * self.radius * self.radius


@fieldwise_init
struct Square(ImplicitlyCopyable, Movable, Shape):
    var side: Float64

    def name(self) -> String:
        return "square"

    def area(self) -> Float64:
        return self.side * self.side


@fieldwise_init
struct Triangle(ImplicitlyCopyable, Movable, Shape):
    var side: Float64

    def name(self) -> String:
        return "triangle"

    def area(self) -> Float64:
        return sqrt(3.0) / 4.0 * self.side * self.side


def padded(text: String, width: Int) -> String:
    var out = text
    while out.byte_length() < width:
        out += " "
    return out


def row[T: Shape](shape: T) -> String:
    return padded(shape.name(), 10) + String(shape.area())


def main():
    print(padded("shape", 10) + "area")
    print("----------------------------")
    print(row(Circle(1.0)))
    print(row(Square(2.0)))
    print(row(Triangle(3.0)))

Cómo funciona

  1. Shape exige un name y un area de todo tipo que conforme.
  2. Circle, Square y Triangle implementan el par con su propia fórmula.
  3. padded empuja una cadena hasta un ancho fijo para que las columnas alineen.
  4. row[T: Shape] se compila una vez por figura, así que la tabla no cuesta nada al correr.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
61
Caracteres a escribir
1078
Tokens
289
Ritmo de tres estrellas
70 tpm

Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 248 segundos.

Escribe este fragmento

Paso 2 de 2 en Bis; paso 22 de 22 en Structs y traits.

← Anterior