【发布时间】:2020-09-11 08:00:49
【问题描述】:
我正在使用 Ramda 来清理我的代码。我有一些复杂的检查需要做。我决定使用 ramda 的 allPass 和 anyPass 而不是 && 和 ||。
但我有一个问题。 AllPass,即使其中一个条件为假,也会返回true,而常规的 && 则返回假。
第一个检查是假的,第二个是真的。然而,这种奇怪的事情正在发生。
// Regulr &&, returns false
const emptyView =
R.contains(itemType, [IItemType.ONE, IItemType.TWO]) &&
R.equals(mode, IViewMode.VIEW);
// Ramda allPass returns true
const emptyView = R.allPass([
R.contains(itemType, [IItemType.JSON, IItemType.AVRO]),
R.equals(mode, IViewMode.VIEW),
]);
谁能给我解释一下为什么?我尝试了 Ramda 的两种变体。一个普通的数组,也调用了该函数,带有必要的信息,但没有运气。我做错了什么?
【问题讨论】:
-
你确定第二个
emptyView不只是一个函数,因此总是计算为true? -
我认为
allPass的行为类似于allPass([f, g, h]) //~-> (x, y) => f(x, y) && g(x, y) && (h(x, y)。生成函数中的参数数量是f、g和h中最大的一个(理想情况下它们应该都相同),当然你实际传递给它的函数数量取决于你.但它不是替代foo && bar && baz。它接受函数并生成函数。
标签: javascript typescript evaluation ramda.js