Für diejenigen, die Python noch nicht kennen, haben wir Darts Grammatik zusammengefasst. Ich habe mich nur auf die Unterschiede zu Python konzentriert. Ich strebe ein Level an, in dem ich den Code der einfachen App von flattern verstehen kann.
Wenn Sie Fehler haben, können Sie diese gerne kommentieren!
In Dart müssen Sie unbedingt eine Funktion namens "main" in der Datei definieren. Dies liegt daran, dass es automatisch zuerst aufgerufen wird, wenn die Datei ausgeführt wird. Da das Programm wie ... geschrieben wird, indem eine andere Funktion von der Hauptfunktion aufgerufen wird, wird im Grunde die gesamte Verarbeitung in die Funktion geschrieben. (Natürlich können Klassenvariablen außerhalb der Funktion definiert werden.
Python ist dynamisch typisiert, aber Dart unterstützt sowohl dynamische als auch statische Typisierung. Bei der statischen Typisierung wird der Typ des Objekts angegeben, das in der Variablen enthalten sein soll, oder der Rückgabewert im Code. Dynamisches Tippen ist das Gegenteil.
** In der folgenden Erläuterung wird die Hauptfunktion der Einfachheit halber weggelassen. ** ** **
Grundsätzlich müssen Sie am Ende der Zeile ein Semikolon schreiben.
print("hoge");
Beschreiben Sie die Einheit mit {}
anstelle von Einzug. Es scheint, dass Sie nach der mittleren Klammer kein Semikolon benötigen.
hoge(){
print("hoge");
}
// coment
/* hoge
hoge
hoge
*/
///document
///document
Sie müssen die Variable mit var
definieren, bevor Sie die Zuweisung vornehmen.
var hoge;
Definitionen und Zuordnungen können auch in einer Zeile geschrieben werden.
var hoge = 0;
Anstelle von "var" kann es durch Angabe des Typs definiert werden. In diesem Fall kann die Variable nicht als Objekt dieses Typs zugewiesen werden.
int hoge = 0;
Wenn Sie zu Beginn einen Unterstrich hinzufügen, wird dieser als privat behandelt und Sie können von außerhalb der Klasse nicht darauf zugreifen.
int _hoge = 2;
Wie bei Python ist die Zuweisung "wie das Einfügen eines Namensaufklebers". (Referenz übergeben) Daher tritt Beispielphänomen auf. Die Spezifikationen von Coco Rahen scheinen gleich zu sein.
Sie können Konstanten mit "const" und "final" definieren. Ich habe den Unterschied zwischen den beiden zusammengefasst.
Qualifikation | Richtig verwenden(Persönliche Ansicht) | Erläuterung |
---|---|---|
final |
Wenn nicht gleichzeitig mit der Definition zugewiesen. | Dies bedeutet: "Sobald Sie ein Objekt einer Variablen zugeordnet haben, kann diese Variable keinem anderen Objekt zugeordnet werden." Jedoch,final Der Wert kann zum Zeitpunkt des Hinzufügens möglicherweise nicht zugewiesen werden. Darüber hinaus ist es möglich, die Position des Speicherbereichs zu ändern, ohne ihn zu ändern (z. B. die Elemente eines Arrays zu ändern). |
const |
Beim Ersetzen gleichzeitig mit der Definition. | const Im Falle von ist die Änderung des Inhalts des Speicherbereichs überhaupt nicht zulässig. Mit anderen Worten, es ist unmöglich, die Elemente des Arrays zu ändern. Es ist notwendig zu ersetzen, wenn Sie einen Job bekommen. |
Es ist nicht erforderlich, "var" hinzuzufügen, da es zum Zeitpunkt der Definition an erster Stelle verwendet wird. Es enthält auch die Bedeutung des Definierens.
final hoge;
Natürlich können Sie auch den Typ angeben.
const int hoge =0;
Sie können eine Variable in eine Zeichenfolge einbetten, indem Sie den Variablennamen nach der Dollarmarke "$" schreiben. Wenn es sich nicht um einen String-Typ handelt, wird er automatisch in einen String-Typ konvertiert.
var hoge = 0;
print("hoge refers $hoge");
Wenn Sie einen Ausdruck anstelle einer Variablen einbetten möchten, schließen Sie den Ausdruck in geschweifte Klammern ein.
print("1 + 1 = ${1 + 1}");
Gehen Sie beim Konvertieren vom String-Typ zum Int-Typ wie folgt vor.
var one = int.parse('1');
Gehen Sie beim Konvertieren vom Typ int in den Typ String wie folgt vor. Wenn Sie konvertieren möchten, um in eine Zeichenfolge eingebettet zu werden, verwenden Sie [Code oben](# Variablen in Zeichenfolge einbetten).
String oneAsString = 1.toString();
Es gibt keinen bestimmten Wortlaut, um die Definition der Funktion zu deklarieren.
hoge(int number){
return number;
}
Sie können den Rückgabetyp vor dem Funktionsnamen deklarieren. Schreiben Sie als "void", das keinen Rückgabewert zurückgibt.
int hoge(int number){
return number;
}
Wenn die Funktion nur eine Verarbeitungszeile enthält, können Sie mit der Pfeilmarkierung =>
einfach zu lesenden Code schreiben. => Ausdruck
ist eine vereinfachte Schreibweise {return expression;}
.
void main() => print("hoge");
Formale Argumente in geschweiften Klammern können durch Angabe des formalen Arguments übergeben werden. Benannte Argumente sind in der optionalen Argumentkategorie enthalten und können weggelassen werden. Wenn nicht angegeben, wird "null" zurückgegeben. Im Gegensatz zu Python können Sie ein formales Argument nur mit einem benannten Argument übergeben.
int hoge({int number}){
return number;
}
Wenn Sie es nicht weglassen möchten, können Sie es erzwingen, indem Sie "@ required" hinzufügen. Sie müssen jedoch "package: meta / meta.dart" importieren, um diese Anmerkung zu verwenden.
int hoge({@required int number}){
return number;
}
Verwenden Sie beim Aufruf den Doppelpunkt :
, um das Argument anzugeben.
hoge(name : "Mike");
Von den Hauptoperatoren werden nur diejenigen zusammengefasst, die sich zwischen Python und Dart unterscheiden.
Dart | Python |
---|---|
~/ | // |
++ | +=1 |
-- | -=1 |
&& | and |
|| | or |
??=
Einer der Zuweisungsoperatoren. Da es üblich ist, einen bestimmten Prozess auszuführen, wenn er null ist, wird ein praktischer Operator bereitgestellt. Dieser Operator führt die Zuweisungsverarbeitung nur durch, wenn die linke Seite null ist.
int a;
a ??= 3;
Schließlich wird a durch 3 ersetzt.
??
Ähnlich wie der obige Operator, aber dies ist eine Klasse von Ausdrücken, die einen Wert zurückgeben. Gibt die rechte Seite zurück, wenn die linke Seite null ist.
int a;
print(a ?? 3)
3 wird an die Konsole ausgegeben.
Grundsätzlich muss die Bedingung in ()
gesetzt werden.
if
Dies ist der einzige Unterschied.
Dart | Python |
---|---|
else if |
elif |
bool value? Expression: Wird in Form eines Ausdrucks verwendet
. Gibt den Ausdruck auf der linken Seite des Doppelpunkts zurück, wenn der Bool-Wert True ist, und gibt den Ausdruck auf der rechten Seite zurück, wenn False.
var isPerson = true;
print(isPerson ? "Yes": "No");
In diesem Fall wird Ja ausgegeben.
for
Der Bedingungsteil wird geschrieben als "(Variablendefinition und -zuweisung; Fortsetzungsbedingung; Fortsetzungsverarbeitung)".
for (int number = 0; number < 3; number++){
print(number);
}
Es unterstützt auch das Schreiben ähnlich wie Python-Code.
var numbers = [0, 1, 2];
for (var number in numbers) {
print(number);
}
switch
Es gibt einige Dinge, aber ich habe es in Python nicht verwendet, deshalb werde ich es vorerst weglassen.
import
Geben Sie in Python den Namen des Pakets oder Formats an, in Dart jedoch den URI. Da URI eine Zeichenfolge und kein Bezeichner ist, wird es in einfache oder doppelte Anführungszeichen gesetzt. URI ist übrigens eine Weiterentwicklung der URL, und es handelt sich um eine Notation, die auf der Idee basiert: "Geben wir allen einen Namen wie URL, indem wir andere Schemata als http und https verwenden, die in URLs verwendet werden!" Methode. Die URI-Struktur lautet [Schema: Pfad]. [^ 1] Das Schema für die Verwendung von Paketen lautet "package", und bei Verwendung der in Dart integrierten Bibliothek ist "dart".
Wenn Sie nur eine andere Dartdatei lesen möchten, geben Sie den absoluten Pfad oder den relativen Pfad ein.
Anweisungen, die mit "@" beginnen, werden als Anmerkungen bezeichnet und werden verwendet, um Methoden und dergleichen bestimmte Eigenschaften zuzuweisen. Es ist wie ein Dekorateur in Python.
Der Unterschied zwischen Klassenvariablen und Instanzvariablen besteht darin, ob mit "statisch" qualifiziert werden soll oder nicht. Wenn es geändert wird, wird es als Klassenvariable behandelt und kann als Variable behandelt werden, die allen Klassen gemeinsam ist. Der zu definierende Ort befindet sich sowohl für Klassenvariablen als auch für Instanzvariablen direkt unter class. Im Gegenteil, es kann nur direkt unter der Klasse definiert werden.
Wenn Sie Zweifel an Python-Klassen haben [Meine Arbeit hier](https://qiita.com/basashi/items/69fee6df0f23f140e91c#q3-%E3%82%AF%E3%83%A9%E3%82%B9% E5% A4% 89% E6% 95% B0% E3% 81% A8% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 82% BF% E3% 83% B3% E3% 82% B9% E5% A4% 89% E6% 95% B0% E3% 81% AE% E9% 81% 95% E3% 81% 84).
class JapanesePerson{
static String nationality = "Japan"; //Klassenvariable
int age; //Instanzvariable
String name; //Instanzvariable
}
this
Im Gegensatz zu Python ist es nicht erforderlich, einer Methode eine Instanz als Argument für sich selbst zuzuweisen. In Dart ist dies eine spezielle Variable, die sich selbst zurückgibt, wenn sie innerhalb einer Methode verwendet wird.
class Person{
String name;
void info(){
print("My name is ${this.name}");
}
}
Genau der gleiche Name wie die Klasse
Der Rückgabetyp ist nicht angegeben
Kein Rückgabewert
Eine Methode, die alle oben genannten Anforderungen erfüllt, wird als Konstruktor anerkannt.
class Person{
String name;
Person(name){
this.name = name;
}
}
Verschiedene Funktionen des Konstruktors unten
Wenn Sie eine Instanzvariable an das Argument des Konstruktors übergeben, wird der Zuweisungsprozess automatisch ausgeführt. Es ist genau das gleiche wie der obige Code.
class Person {
String name;
Person(this.name);
}
In Dart und Python gibt es keine Überladung (eine Funktion, die einen Konstruktor mit demselben Namen definiert und ihn automatisch entsprechend der Anzahl der Variablen verwendet). Alternativ können Sie mehrere Konstruktoren mit "class name.arbitrary name ()" erstellen. Beim Instanziieren muss es jedoch als Klassenname einschließlich seines Namens instanziiert werden.
class Person{
String name;
Person(name){
this.name = name;
}
Person.gest(){
this.name = "gest";
}
}
Verwenden Sie diese Option, wenn Sie ein Objekt instanziieren möchten, dessen Variablenwert sich nicht ändert. Es ist notwendig, alle Varianten konstant zu machen und dem Konstruktor "const" voranzustellen.
class Hoge{
final name;
const Hoge(this.name);
}
Wenn Sie einen anderen Konstruktor nach dem Doppelpunkt schreiben, können Sie einen anderen Konstruktor aufrufen und den Prozess mit einem Schlagstock berühren. In diesem Fall gibt sich dies selbst zurück, dh Person, also übergeben wir "gest" an den Personenkonstruktor.
class Person{
String name;
Person(name){
this.name = name;
}
Person.gest(): this("gest");
}
In Python wird die übergeordnete Klasse in "()" beschrieben, in Dart jedoch nach "erweitert".
class Person{
int age;
String name;
}
class JapanesePerson extends Person{
static String nationality = "Japan";
}
super
super
gibt die übergeordnete Klasse zurück. Sie können sich vorstellen, dass der Superteil als Klassenname verstümmelt ist. Wenn Sie also "super ()" ausführen, rufen Sie den Konstruktor der übergeordneten Klasse auf.
Der große Unterschied zu Python besteht darin, dass ** super
im Konstruktor ** nicht verwendet werden kann. Um dies zu vermeiden, verwenden Sie Konstruktorumleitungen.
Wenn Sie den Konstruktor der übergeordneten Klasse aufrufen, sieht dies folgendermaßen aus. Wir verwenden auch Constructor Redirect (#Constructor Redirect) und Syntactic Sugar (# Syntactic-Sugar nützliche Syntax).
class Person{
int age;
String name;
Person(this.age, this.name);
info (){
print("My name is ${this.name}.");
}
}
class JapanesePerson extends Person{
static String nationality = "Japan";
var prefecture;
JapanesePerson(age, name, this.prefecture): super(age, name);//Hier
}
Sie müssen "@ override" als Anmerkung in die obige Zeile einfügen.
@override
info(){
print("hoge");
}
setter/getter
Ich bin mir immer noch nicht sicher. Wird studieren. .. .. Ich sehe nicht viel im Flutter-Code.
assert()
Wenn der an das Argument übergebene Ausdruck "false" ist, wird ein Fehler ausgegeben. Es scheint während der Entwicklung verwendet zu werden. Dieser Code wird bis auf das Debuggen ignoriert. Ich erhalte eine Fehlermeldung mit dem folgenden Code.
var n = 3;
assert(n == 1);
Einführung in Dart 2 für Anfänger
Über Dart-Konstruktoren | Developers.IO
[^ 1]: Es ist der Pfadteil, aber im Fall von http ist der Anfang des Pfads //
, richtig? Dies scheint nur dann eine Regel zu sein, wenn das Schema http ist.