Track
/
Go
Go
/
Esercizi
/
I giocattoli di Jedlik
I giocattoli di Jedlik

I giocattoli di Jedlik

Esercizio di apprendimento

Introduzione

Un metodo è una funzione con uno speciale argomento ricevitore. Il ricevitore compare nella propria lista di argomenti tra la parola chiave func e il nome del metodo.

func (receiver type) MethodName(parameters) (returnTypes) {
}

Puoi definire un metodo solo con un ricevitore il cui tipo è definito nello stesso pacchetto del metodo.

package person 

type Person struct {
	Name string
}

func (p Person) Greetings() string {
	return fmt.Sprintf("Welcome %s!", p.Name)
}

Il metodo sullo struct può essere chiamato tramite notazione puntata.

p := Person{Name: "Bronson"}
fmt.Println(p.Greetings())
// Output: Welcome Bronson!

Nota come abbiamo chiamato il metodo Greetings() sull'istanza p di Person. È esattamente come chiamare i metodi in un linguaggio di programmazione orientato agli oggetti.

Ricorda: un metodo è solo una funzione con un argomento ricevitore. I metodi aiutano a evitare conflitti di denominazione: dato che un metodo è legato a un particolare tipo di ricevitore, puoi avere lo stesso nome di metodo su tipi diversi.

import "math"

type rect struct {
	width, height int
}
func (r rect) area() int {
	return r.width * r.height
}

type circle struct {
	radius int
}
func (c circle) area() float64 {
	return math.Pow(float64(c.radius), 2) * math.Pi
}

Esistono due tipi di ricevitori: i ricevitori di valore e i ricevitori di puntatore.

Tutti i metodi che abbiamo visto finora hanno un ricevitore di valore, quindi ricevono una copia del valore passato al metodo: qualsiasi modifica fatta al ricevitore all'interno del metodo non è visibile a chi chiama.

Puoi dichiarare metodi con ricevitori di puntatore per modificare il valore a cui punta il ricevitore. Questo si fa anteponendo un * al nome del tipo. Per esempio, con il tipo rect, un ricevitore di puntatore verrebbe dichiarato come *rect. Tali modifiche sono visibili anche a chi chiama il metodo.

type rect struct {
	width, height int
}
func (r *rect) squareIt() {
	r.height = r.width
}

r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20

r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10

Istruzioni

Nota: questo esercizio è la continuazione dell'esercizio need-for-speed.

In questo esercizio organizzerai gare tra vari tipi di auto radiocomandate. Ogni auto ha le proprie caratteristiche di velocità e di consumo della batteria.

Le auto partono con la batteria carica al 100%. Ogni volta che guidi l'auto con il radiocomando, questa percorre un numero di metri pari alla sua velocità e la percentuale di batteria rimanente diminuisce del suo consumo.

Se la batteria di un'auto è sotto la sua percentuale di consumo, non puoi più guidarla.

L'auto radiocomandata ha un sofisticato display a LED che mostra due informazioni:

  • La distanza totale percorsa, visualizzata come: "Driven <METERS> meters".
  • La carica rimanente della batteria, visualizzata come: "Battery at <PERCENTAGE>%".

Ogni pista ha la sua distanza. Le auto vengono testate verificando se riescono a completare la pista senza esaurire la batteria.

1. Guida l'auto

Implementa il metodo Drive su Car che aggiorna il numero di metri percorsi in base alla velocità dell'auto e riduce la batteria in base al consumo:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car.Drive()
// car is now Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}

Nota: non provare a guidare l'auto se così facendo la batteria scenderebbe sotto 0.

2. Mostra la distanza percorsa

Implementa un metodo DisplayDistance su Car che restituisce la distanza come viene visualizzata sul display a LED, sotto forma di string:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayDistance())
// Output: "Driven 0 meters"

3. Mostra la percentuale della batteria

Implementa il metodo DisplayBattery su Car che restituisce la percentuale della batteria come viene visualizzata sul display a LED, sotto forma di string:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayBattery())
// Output: "Battery at 100%"

4. Verifica se un'auto radiocomandata può completare una gara

Per completare una gara, un'auto deve essere in grado di percorrere la distanza della gara. Ciò significa non esaurire la batteria prima di aver tagliato il traguardo. Implementa il metodo CanFinish che prende un trackDistance int come parametro e restituisce true se l'auto riesce a completare la gara, altrimenti false:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

trackDistance := 100

car.CanFinish(trackDistance)
// => true
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Go Exercism

Vuoi iniziare I giocattoli di Jedlik?

Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti166 esercizi e il mentoring di persone reali, tutto gratis.