2014-05-23 16 views
6

Widzę dużo kodu Rust gdzie sprawozdanie use wyglądać następująco:Dlaczego firma Rust promuje instrukcje użycia z wyraźnym importem?

use std::io::net::ip::{SocketAddr, Ipv4Addr}; 

Sposób, w jaki się go ogranicza to stwierdzenie use tylko importować SocketAddr i Ipv4Addr.

Patrząc z perspektywy języków, takich jak Java lub C#, wydaje się to dziwne, ponieważ w przypadku takich języków instrukcja importu zawsze importuje wszystkie typy publiczne.

Uznałem, że w Rust można użyć tego samego.

use std::io::net::ip::*; 

Jedynym powodem widziałem do wyraźnego nazewnictwa byłoby uniknąć konfliktów, gdzie dwa różne import będzie zawierać API publicznych o tych samych nazwach. Można to jednak rozwiązać z aliasingiem, więc zastanawiam się, czy istnieje jeszcze jedna zaleta bardziej rygorystycznego podejścia "importuj tylko to, co jest potrzebne"?

+6

Innym sposobem robienia rzeczy jest użycie 'std :: io :: net :: ip'. Następnie w swoich typach dostępu do kodu z 'ip :: SocketAddr'. Nie ryzykujesz kolizji przestrzeni nazw z importem globu przy zachowaniu krótkich typów. – luke

+1

Myślę, że masz na myśli "import" wszędzie, gdzie piszesz "eksport" lub nie rozumiem twojego punktu widzenia. Edycja: Również w Javie masz 'import com.acme.dynamite.Stick', a także' import com.acme.dynamite. * ', Tylko preferencja jest przełączana. – delnan

+0

Tak, masz rację. Moje sformułowanie było nieprawidłowe we wstępnym pytaniu. – Christoph

Odpowiedz

7

Rdza jest zainspirowana przez Pythona, który ma podobną zasadę: importowanie jest jednoznaczne i chociaż globalny import (use x::* w Rust, from x import * w Pythonie) jest obsługiwany, nie są one ogólnie zalecane.

Ta filozofia ma pewne praktyczne skutki; Na przykład wywołanie metody cechy może być wykonane tylko wtedy, gdy cecha jest w zasięgu, a zatem wywołanie metody cechy w przypadku kolizji nazw w importowanych cechach jest dość trudne (w przyszłości poprawi się to dzięki składni wywoływania funkcji jednolitej , gdzie można zadzwonić pod numer Trait::function(self), a nie tylko self.function()).

Przeważnie jest to coś, co jest dobrze wyrażone w Zen Pythona: "wyraźne jest lepsze niż niejawne". Gdy szeroki zakres rzeczy jest w zasięgu, może być trudno zobaczyć, co pochodzi z miejsca, a intymna znajomość struktury modułu i/lub narzędzi staje się dość ważna; jeśli wszystko jest jednoznaczne, oprzyrządowanie jest w dużej mierze niepotrzebne, a ręczna praca z plikami w prostym edytorze tekstu jest wykonalna. Oczywiście, narzędzia będą nadal w stanie pomóc, ale nie jest to konieczne.

Dlatego właśnie Rust przyjął filozofię importowania jawnego Pythona.

3

w którym Huon pisze

pewnych aspektów z nich dramatycznie komplikują algorytm rozpoznawania nazw (jak rozumiem), a mimo to, mają różne wady dla rzeczywistego kodu, np odpowiednik w Pythonie jest niezadowolony: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#importing

Może nie są one takie złe w skompilowanym statycznie napisanym języku? I Nie wiem; tak czy inaczej, osobiście znajduję kod bez importu globu, łatwiejszy do odczytania, ponieważ mogę sprawdzić, która funkcja jest nazywana bardzo łatwo, podczas gdy import globu wymaga więcej wysiłku.

gdzie nikomatsakis pisze

myślę import glob mają swoje miejsce. Na przykład we wskaźniku wypożyczania znajduje się płytkie drzewo submodułów, które wykorzystują typy danych zdefiniowane w borrowck/mod.rs. Wydaje się dość nudny i głupi, aby wymagać ręcznego importowania wszystkich tych nazw, a po prostu pisania use rustc::middle::borrowck::*. Wiem jednak, że w algorytmie rozdzielczości są jednak komplikacje, a ja byłbym bardziej podatny na argument oparty na fundamentalnych wyzwaniach.

ten następnie przeniósł się do RFC 305 który został odrzucony przez steveklabnik bez komentarza o tym, czy są one dobrym stylu:

import Glob są teraz stabilne, i tak mam zamiar dać ten bliski.

+2

Referencje są świetne, ale generowane są tylko odpowiedzi z linkami. Twoja odpowiedź będzie bezwartościowa, gdy tylko te adresy są martwe. Jeśli chcesz poprawić swoją odpowiedź, zapisz jej treść tutaj (możesz zacytować) i używaj tylko linków, aby utworzyć kopię zapasową odpowiedzi i podać dalsze informacje. –

Powiązane problemy