gpt4 book ai didi

dart - 在Dart中等效

转载 作者:行者123 更新时间:2023-12-03 04:19:49 25 4
gpt4 key购买 nike

我刚刚开始探索Dart语言,并且想测试给定的用Java写的现有代码:

public interface Condition {

Condition FALSE = facts->false;

Boolean evaluate(Fact<?> fact);

default Condition and(Condition other) {
return fact-> this.evaluate(fact) && other.evaluate(fact);
}

default Condition or(Condition other) {
return fact-> this.evaluate(fact) || other.evaluate(fact);
}
}
call 者将其称为:
    @Test
public void testCondition() {
String str = "A String";
Condition a = fact -> !str.isBlank();
Condition b = fact -> str.contains("A");
a.and(b);
}
利用此功能的完整测试类是:
public class AnonymousLoopTest {
@Test
public void test() {
RulesEngine rulesEngine = new InferenceRuleEngine();
List<Name> names = NamesFactory.fetchNames();
Rules rules = new Rules();
Facts facts = new Facts();
AtomicReference<Integer> countRef = new AtomicReference<>(1);
names.forEach(personName -> {
facts.put("name-" + countRef.get(), personName);
countRef.set(countRef.get()+1);
Condition condition = fact -> !personName.name().isEmpty();
//Hack the comparator logic of DefaultRule/BasicRule in order to override its internal logic as below.
//This is needed to register our Rule with Rules which uses a Set<Rule> to register new Rules
//with the comparator logic written in BasicRule.
Rule nameRule = new RuleBuilder((o1, o2) -> personName.name().compareTo(o1.getName()))
.when(condition).then(action -> System.out.println("In Action:" + personName)).build();
rules.register(nameRule);
});
rulesEngine.fire(rules, facts);
}

}

record Name(Integer id, String name){}

class NamesFactory{
static List<Name> fetchNames(){
return List.of(new Name(10, "Sara"), new Name(20, "Zara"), new Name(30, ""),new Name(40, "Lara"));
}
}
该条件由 when()方法使用。
在给定的示例中,空白名称将被过滤掉。其他三个名称将被打印。
我试图用Dart进行写作并取得同等成绩,但我只是被卡住了。用Dart编写此代码的方式是什么?

最佳答案

这看起来像我要做的事情:

typedef Condition = bool Function(Fact);
bool falseCondition(Fact _) => false;
extension ConditionComposition on Condition {
Condition operator &(Condition other) => (Fact fact) => this(fact) && other(fact);
Condition operator |(Condition other) => (Fact fact) => this(fact) || other(fact);
Condition operator ~() => (Fact fact) => !this(fact);
}
如果您坚持为函数对象提供一个包装器类,那么我可以这样做:
class Condition {
static const Condition falseCondition = Condition(_kFalse);

final bool Function(Fact) _test;
const Condition(bool test(Fact fact)) : _test = test;

bool evaluate(Fact fact) => _test(fact);

Condition operator &(Condition other) => Condition((fact) =>
this.evaluate(fact) && other.evaluate(fact));

Condition operator |(Condition other) => Condition((fact) =>
this.evaluate(fact) || other.evaluate(fact));

static bool _kFalse(_) => false;
}
但是一个类对于实际上只是一个简单功能的某些东西来说似乎有些过头了。 Dart具有一流的功能。
您可以将以前的版本用作:
  test("test Condition", () {
var str = "A String";
Condition a = (fact) => str.isNotEmpty();
Condition b = (fact) => str.contains("A");
var both = a & b;
expect(both(someDefaultFact), true);
}

关于dart - 在Dart中等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63353335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com