是否可以在 dart 中创建字符串扩展“isEmptyOrNull”?

Is it possible to create a String extension `isEmptyOrNull` in dart?

提问人:Joel Broström 提问时间:11/13/2023 更新时间:11/14/2023 访问量:79

问:

首先,让我们为此扩展定义一些标准:

  1. 如果对象为 null 或空字符串,则应返回 true。
  2. 我应该能够在链接的可为 null 的对象上使用它。
  3. 我不应该使用括号、类型转换或使用扩展名时。== 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');
}

如果此代码编译,遵循所有标准,并编写正确的输出,我会认为解决方案是正确的。

Flutter dart 扩展方法 可为空性

评论

1赞 Randal Schwartz 11/14/2023
您的扩展必须处于 on(基本上是所有内容)才能包含在 上,这是该类的单例实例。Object?nullNull
0赞 mezoni 11/14/2023
你的问题不正确。 那些试图回答这个问题的程序员都不是有经验的程序员。A nullable expression can't be used as a condition. Try checking that the value isn't 'null' before using it as a condition.

答:

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,则 的结果为 。aa?.xnull

如果计算结果为非 null,则 的结果与 的结果相同。aa?.xa.x

这样,您的代码将永远无法编译。

final MyObject? obj = null;
if(obj?.str.isEmptyOrNull){
  print('object was empty string or had the value null');
}