Dart: le librerie principali

Di - 1 December 2012 - in

Nelle scorse settimane ci siamo avvicinati all’ecosistema di Dart, abbiamo visto quali sono i concetti principali di questo nuovo linguaggio, i suoi punti di forza e gli strumenti di sviluppo messi a disposizione. Da oggi entreremo nel vivo del linguaggio, cominceremo ad esplorarne le librerie principali, le funzioni più interessanti e vedremo come utilizzare Dart per gli scopi più comuni.

Iniziamo subito con le funzioni associate al tipo di dato String; un oggetto String rappresenta una stringa di caratteri e i metodi principali sono comuni a tutti gli altri linguaggi:

main(){
  String url ="http://www.engeene.it";

  print(url);
  print(url.toLowerCase());
  print(url.toUpperCase());
  print(url.split("://")[0]);
  print(url.substring(11,18));
}

restituisce questo output nella console:

http://www.engeene.it

http://www.engeene.it


HTTP://www.engeene.it

[http://www, GoogLab, it]
http
GoogLab

Se stiamo usando il Dart Editor, basterà digitare il nome dell’identificatore della stringa seguito da un punto per vedere quali sono i metodi disponibili per l’oggetto.

La quarta riga, compresa fra parentesi quadre, è il risultato del metodo split() ed è una lista: una lista è un insieme ordinato di elementi, equivalente degli array negli altri linguaggi.

Una lista può contenere elementi di qualisiasi tipo (anche liste) e si dichiara con questa sintassi:

List<tipo> identificatore = [ elemento0 , elemento1 , elemento2 ] ;

List<String> lettere = ['a','b','c','d'];
List<int> numeri = [0,1,2,3,4,5,6];

Se volessimo creare una nuova lista con gli elementi restituiti da split(), l’istruzione sarebbe:

List<String> lista = url.split("://");
print(lista);

Il metodo split() “spezza” una stringa nel punto (o nei punti) definiti nell’argomento, in questo caso:

[http, www.engeene.it]

Il metodo substring(n,m) restituisce la porzione di stringa dal carattere n al carattere m.

Un altro modo interessante per costruire una stringa è usare il metodo fromCharCodes(), che prende in ingresso una lista di char codes:

List<int> charcodes = [103, 111, 111, 103, 108, 97, 98];
print(new String.fromCharCodes(charcodes)); // googlab

Questo modo risulta estremamente utile quando stiamo maneggiando file binari.

Anche per le liste i metodi built-in sono comuni agli altri linguaggi:

List<String> browsers = ['Chrome', 'Firefox' , 'Opera' , 'Dolphin'];

print(browsers.length); // lunghezza della lista
print(browsers.isEmpty); // booleano, vero se la lista è vuota
browsers.clear(); // svuota la lista
print(browsers); // []

browsers.add('Chrome');
browsers.add('Firefox');
browsers.addAll(['Opera','Dolphin']);
browsers.add('Konqueror');

browsers.removeAt(1); // rimuove l'elemento di indice 1, 'Firefox'
browsers.removeLast(); // rimuove l'ultimo elemento
browsers.removeRange(1,2); // rimuove 2 elementi a partire dall'elemento 1

Per quanto riguarda le iterazioni abbiamo due modi principali; il primo, classico, è consigliato quando si ha bisogno dell’indice dell’elemento oltre che dell’elemento stesso:

// primo modo
for ( var i = 0 ; i < browsers.length ; i++){
  print('${browsers[i]} ha indice $i');
}

// secondo modo
for ( var browser in browsers ){
  print(browser);
}

Un’altra componente fondamentale del core di Dart sono le mappe, ovvero oggetti che associano ad una chiave un valore. Una mappa può essere dichiarata in modo letterale o con un costruttore

// dichiarazione letterale
var dizionario = { 'uno':'one' ; 'due':'two' ; 'tre':'three' } ;

// costruttore
Map<String,String> dizionario = new Map();
dizionario['uno'] = 'one';
dizionario['due'] = 'two';

Alcune funzioni utili: keys e values restituiscono rispettivamente la lista delle chiavi e quelle dei valori:

print(dizionario.keys);
print(dizionario.values);

Iterazioni:

for ( var chiave in dizionario.keys ){
  print('La traduzione di $chiave è ${dizionario[chiave]}');
}

// La traduzione di uno è one
// La traduzione di due è two
// La traduzione di tre è three

Dopo questa velocissima panoramica sulle funzioni più comuni occupiamoci ora di un’altra importante libreria: dart:math. A differenza delle funzioni viste in precedenza, le funzioni matematiche sono definite in una libreria che dobbiamo importare esplicitamente nel nostro progetto:

import 'dart:math';

Per rappresentare un numero in Dart si possono utilizzare i tipi int, double o un più generico num:

int a = 10;
int b = 2;
print(a+b);
print(a-b);
print(a*b);
print(a/b); // 5.0

È bene ricordare che se dobbiamo dividere due numeri interi e ci aspettiamo che il risultato sia un intero possiamo utilizzare l’operatore ~/ (tilde e slash), ovvero integer division:

print(a/b); // 5.0
print(a~/b); // 5

Altre operazioni comuni:

int base = 3;
int esponente = 2;
double denominatore = 1.5;
print(pow(base,esponente)); // elevazione a potenza
print(sqrt(152399025)); // estrazione di una radice quadrata

Lavorare con le costanti:

const double g = 9.81;
int massa = 75;
g = 8; // Restituisce un errore, 'g' è una costante

Se stiamo lavorando con numeri molto grandi o molto piccoli possiamo avvalerci della notazione scientifica. Vediamo come si comporta un’applicazione che deve calcolare il modulo della forza gravitazionale fra due particelle di massa 2 Kg poste a 30 cm di distanza l’una dall’altra:

const double G = 6.67e-11; // costante di gravitazione universale
int m1 = 2;
int m2 = 2;
double r = 0.3;

print((G*m1*m2)/pow(r,2)); // 2.9644444444444444e-9

dove 6.67e-11 è l’equivalente di 6.67 * 10^(-11).

Una classe molto importante della libreria dart:math è la classe Random, ovvero un generatore di numeri casuali:

var random = new Random();
int carta = 1 + random.nextInt(51));  // Valorizza 'carta' con un numero casuale da 1 a 52
print(random.nextBool()) // Restituisce vero o falso
print(random.nextDouble()); // Stampa un numero reale compreso fra 0 ed 1

Sebbene in questo articolo ci siamo occupati solo di una piccola parte delle librerie, le attività che abbiamo visto oggi dimostrano in modo chiaro quanto Dart sia familiare ed intuitivo e come sia semplice iniziare a scrivere in Dart per coloro che conoscono altri linguaggi; a tal riguardo ricordiamo che l’applicazione Synonym contiene numerosi snippets di codice Dart affiancati ai corrispettivi in JavaScript e C#.

Nel prossimo appuntamento con questa rubrica analizzeremo una web application completa e avremo così modo di esplorare a fondo la libreria dart:html.

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: