提问人:Joel Broström 提问时间:11/13/2023 更新时间:11/14/2023 访问量:79
是否可以在 dart 中创建字符串扩展“isEmptyOrNull”?
Is it possible to create a String extension `isEmptyOrNull` in dart?
问:
首先,让我们为此扩展定义一些标准:
- 如果对象为 null 或空字符串,则应返回 true。
- 我应该能够在链接的可为 null 的对象上使用它。
- 我不应该使用括号、类型转换或使用扩展名时。
== true
下面是一个应该可行的示例:
extension StringExtension on String? {
bool get isEmptyOrNull {
// Implementation
}
}
class MyObject {
MyObject({this.myString});
final String? str;
}
// somewhere in the code:
final MyObject? obj = null;
if(obj?.str.isEmptyOrNull){
print('object was empty string or had the value null');
}
如果此代码编译,遵循所有标准,并编写正确的输出,我会认为解决方案是正确的。
答:
1赞
Sayid
11/13/2023
#1
我尝试根据所有标准编写代码,结果是这样的
extension StringExtension on String? {
bool get isNull => this == null;
bool get isEmptyOrNull => isNull || this!.isEmpty;
}
class MyObject {
MyObject({this.str});
final String? str;
}
// somewhere in the code:
void main() {
const MyObject? objNull = null;
final MyObject objStrNull = MyObject();
final MyObject objStrEmpty = MyObject(str: '');
final MyObject objStrNotEmpty = MyObject(str: 'str');
print(objNull?.str.isEmptyOrNull); // null
print((objNull?.str).isEmptyOrNull); // true
print(objStrNull.str.isEmptyOrNull); // true
print(objStrEmpty.str.isEmptyOrNull); // true
print(objStrNotEmpty.str.isEmptyOrNull); // false
}
但是如果没有带有 null 对象的括号,它会生成 null 而不是布尔值
评论
0赞
Joel Broström
11/13/2023
是的,这也是我的方法,但正如你所说,它在第一种情况下不起作用。我们还在所有项目中使用了非常好的 lint 5.1.0,它会将括号标记为 linting 错误,并表示这不是不必要的。而且由于我的 vs 代码设置为在保存时运行 dart fix,它会自动删除 ,从而导致错误。如果我关闭修复程序,我的代码将不会通过检查 linting 错误的管道,所以我无法使用它。但这是一个很好的尝试,我会给你一个尝试的赞成票:+1:()
1赞
Parrots Code
11/13/2023
#2
是的,可以在 Dart 中创建字符串扩展 isEmptyOrNull。
extension StringExtensions on String {
bool get isNullOrEmpty => this == null || isEmpty;
}
若要使用该扩展,只需对任何字符串变量调用 isNullOrEmpty 方法即可。例如:
String myString = '';
if (myString.isNullOrEmpty) {
// The string is null or empty
} else {
// The string is not null or empty
}
评论
0赞
Joel Broström
11/13/2023
确实,如果你有一个 String?,这将起作用,但在我上面的例子中,我有一个包含 String 的可为 null 的对象,并且由于第一个对象的计算结果为 null,因此不会调用该函数,并且表达式将是 null 而不是布尔值。扩展还应扩展 String?为此,请允许这样做。感谢您的尝试!
1赞
Anton Nyström
11/13/2023
#3
这种方法怎么样?
extension StringExtension on String? {
bool get isEmptyOrNull => this?.isEmpty ?? true;
}
class MyObject {
MyObject({this.myString});
final String? str;
}
// somewhere in the code:
final MyObject? obj = null;
if (obj?.str.isEmptyOrNull) {
print('Object was empty string or had the value null');
}
评论
0赞
Joel Broström
11/14/2023
恐怕这也不起作用,因为问题是计算结果为 null,因此不会调用 isEmptyOrNull,整个表达式将简单地计算为 null。但这是一个好主意,也是 ChatGPT 在我问它时推荐的事情之一。obj?
obj?.str.isEmptyOrNull
1赞
mezoni
11/14/2023
#4
operatot 是条件成员访问运算符。?.
仅当成员访问操作数的计算结果为非 null 时,条件成员访问运算符才会对其操作数应用该操作数;否则,它将返回 。那是:?.
null
如果计算结果为 null,则 的结果为 。a
a?.x
null
如果计算结果为非 null,则 的结果与 的结果相同。a
a?.x
a.x
这样,您的代码将永远无法编译。
final MyObject? obj = null;
if(obj?.str.isEmptyOrNull){
print('object was empty string or had the value null');
}
评论
Object?
null
Null
A nullable expression can't be used as a condition. Try checking that the value isn't 'null' before using it as a condition.