One of the questions to which I had no answer during my DevIgnition talk was about the uniqueness of library names in Dart. That is, what are the implications of having two different libraries with the same name in the same codebase? I guessed that it would not make a difference, but I dislike not knowing. Sooo....
I create a
main.dart
that imports two libraries: one for cookies and one for cakes:import 'cookies.dart'; import 'cakes.dart'; main() { var cake = new Cake(3); var cookie = new Cookie(12); print(""" cake has ${cake.number_of_layers} layers cookie has ${cookie.number_of_chips} chips """); }Those are two separate libraries, but I use the same
dessert
identifier for both. The first library in
cakes.dart
contains the library dessert
directive:library dessert; class Cake { int number_of_layers; Cake(this.number_of_layers); }The second library in
cookies.dart
also contains the library dessert
directive:library dessert; class Cookie { int number_of_chips; Cookie(this.number_of_chips); }And, as I had guessed, it works just fine. More importantly, it still passes
dart_analyzer
:➜ libraries dart_analyzer main.dart ➜ libraries dart main.dart cake has 3 layers cookie has 12 chipsThis was a completely contrived example, but there was always the concern that the same library identifier might be used locally and by a Dart Pub package. It seems that such a case will not be a concern.
While I am mucking about with library namespaces, I might as well play with defining the same name in both libraries. I define a
Sprinkles
class in cakes.dart
that takes a boolean in the constructor:library dessert; class Cake { /* ... */ } class Sprinkles { bool chocolate; Sprinkles(this.chocolate); }And in
cookies.dart
, I define a Sprinkles
class that takes a string in the constructor:library dessert; class Cookie { /* ... */ } class Sprinkles { String color; Sprinkles(this.color); }Lastly, I try to use it in
main.dart
:import 'cookies.dart'; import 'cakes.dart'; main() { var sprinkles = new Sprinkles(true); // ... }Now, not only does
dart_analyzer
dislike me, but the dart compiler hates me as well:➜ libraries dart main.dart 'file:///home/chris/repos/dart-presentation/code/libraries/main.dart': Error: line 5 pos 23: ambiguous reference: 'Sprinkles' is defined in library 'file:///home/chris/repos/dart-presentation/code/libraries/cookies.dart' and also in 'file:///home/chris/repos/dart-presentation/code/libraries/cakes.dart' var sprinkles = new Sprinkles(true); ^Happily, this is why the
show
and hide
keywords exist. I opt to “hide” the Sprinkles
definition from the cookies.dart
import:import 'cookies.dart' hide Sprinkles; import 'cakes.dart'; main() { var sprinkles = new Sprinkles(true); var cake = new Cake(3); var cookie = new Cookie(12); print(""" cake has ${cake.number_of_layers} layers cookie has ${cookie.number_of_chips} chips the sprinkles are ${sprinkles.chocolate ? 'chocolate' : 'plain'} """); }Now my code passes
dart_anaylyzer
and compiles too!➜ libraries dart_analyzer main.dart ➜ libraries dart main.dart cake has 3 layers cookie has 12 chips the sprinkles are chocolateI think that about covers my bases on dart libraries. And the next time that I get asked that question about library names, I should be good to go.
Day #593
You can also do this:
ReplyDeleteimport 'cookies.dart' hide Sprinkles;
import 'cookies.dart' as xyz; // Alias
import 'cakes.dart';
void main(){
var sprinkles1 = new Sprinkles(true);
var sprinkles2 = new xyz.Sprinkles("White");
...
}