如何在构造函数主体中初始化不可为 null 的成员?
How do I initialize non-nullable members in a constructor body?
我已经用这种方式在 Dart 中创建了我的 class,但是我得到了 Non-nullable instance field 'text' must be initialized. Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.
我想知道是否有一种方法可以在 'Python'可以进行这种 class 创作的风格,在此先感谢您。
class Lexer {
String _text;
int _pos;
String _current_char;
Lexer(String text) {
this._text = text;
this._pos = -1;
this._current_char = '';
this.advance();
}
void advance() {
this._pos++;
this._current_char = this._pos < this._text.length ? this._text[this._pos] : '';
}
}
class Lexer {
String _text;
int _pos;
String _current_char;
这声明了几个类型为 String
的成员。由于它们被声明为 String
而不是 String?
,因此这些成员是 不可为空的 ;他们永远不会 null
。 (这是 Dart 2.12 中新的空安全特性的一部分。)
。当构造函数的 body 运行时,Dart 期望所有成员变量都已经初始化。因为您的成员不可为空且尚未初始化为非空值,所以这是一个错误。错误消息解释了您可以做什么:
Non-nullable instance field 'text' must be initialized. Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.
使用初始化表达式。这意味着使用 initializer list:
Lexer(String text)
: _text = text,
_pos = -1,
_current_char = '' {
advance();
}
请注意,如果您使用同名构造参数初始化成员,则可以使用 shorthand:
Lexer(this._text)
: _pos = -1,
_current_char = '' {
advance();
}
添加字段初始值设定项。这意味着在 class 声明中初始化成员 inline。
class Lexer {
String _text = '';
int _pos = -1,
String _current_char = '';
Marking your members as late
。这意味着您承诺变量将在任何尝试使用它们之前被初始化。
class Lexer {
late String _text;
late int _pos,
late String _current_char;
使您的成员可为空,这允许它们在默认情况下隐式为空:
class Lexer {
String? _text;
int? _pos,
String? _current_char;
但是,这将要求所有访问在使用之前明确检查成员是否为空。
您可能还想阅读:
我已经用这种方式在 Dart 中创建了我的 class,但是我得到了 Non-nullable instance field 'text' must be initialized. Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.
我想知道是否有一种方法可以在 'Python'可以进行这种 class 创作的风格,在此先感谢您。
class Lexer {
String _text;
int _pos;
String _current_char;
Lexer(String text) {
this._text = text;
this._pos = -1;
this._current_char = '';
this.advance();
}
void advance() {
this._pos++;
this._current_char = this._pos < this._text.length ? this._text[this._pos] : '';
}
}
class Lexer {
String _text;
int _pos;
String _current_char;
这声明了几个类型为 String
的成员。由于它们被声明为 String
而不是 String?
,因此这些成员是 不可为空的 ;他们永远不会 null
。 (这是 Dart 2.12 中新的空安全特性的一部分。)
Non-nullable instance field 'text' must be initialized. Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.
使用初始化表达式。这意味着使用 initializer list:
Lexer(String text) : _text = text, _pos = -1, _current_char = '' { advance(); }
请注意,如果您使用同名构造参数初始化成员,则可以使用 shorthand:
Lexer(this._text) : _pos = -1, _current_char = '' { advance(); }
添加字段初始值设定项。这意味着在 class 声明中初始化成员 inline。
class Lexer { String _text = ''; int _pos = -1, String _current_char = '';
Marking your members as
late
。这意味着您承诺变量将在任何尝试使用它们之前被初始化。class Lexer { late String _text; late int _pos, late String _current_char;
使您的成员可为空,这允许它们在默认情况下隐式为空:
class Lexer { String? _text; int? _pos, String? _current_char;
但是,这将要求所有访问在使用之前明确检查成员是否为空。
您可能还想阅读: