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
Shapeexige unnamey unareade todo tipo que conforme.Circle,SquareyTriangleimplementan el par con su propia fórmula.paddedempuja una cadena hasta un ancho fijo para que las columnas alineen.row[T: Shape]se compila una vez por figura, así que la tabla no cuesta nada al correr.
Palabras clave y builtins usados aquí
Float64IntMovableStringdefprintreturnselfstructtraitvarwhile
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.
Paso 2 de 2 en Bis; paso 22 de 22 en Structs y traits.