【问题标题】:Ramda `cond` else statementRamda `cond` else 语句
【发布时间】:2016-07-01 17:19:51
【问题描述】:

我正在查看Ramdacond function 文档,我对其行为感到困惑。文档指出cond...

返回一个函数fn,它封装了if/else-if/else逻辑。 R.cond 采用 [predicate, transform] 对的列表。全部 fn 的参数依次应用于每个谓词,直到 one 返回一个“真实”值,此时 fn 返回 将其参数应用于相应的转换器。如果没有 谓词匹配,fn 返回 undefined。

这是给出的示例:

var fn = R.cond([
  [R.equals(0),   R.always('water freezes at 0°C')],
  [R.equals(100), R.always('water boils at 100°C')],
  [R.T,           temp => 'nothing special happens at ' + temp + '°C']
]);

fn(0); //=> 'water freezes at 0°C'
fn(50); //=> 'nothing special happens at 50°C'
fn(100); //=> 'water boils at 100°C'

我了解函数的[predicate, transform] 方面,但我不清楚“else”部分是如何工作的。在典型的 if/else-if/else 语句中,“else”部分不接受谓词。然而,在示例中,每个数组都有一个谓词。也许知道R.T 在这种情况下如何运作会有所帮助,但在文档中搜索T 是没有结果的。

如何使用 Ramda 的 cond 函数来捕获条件“else”功能以返回默认值?

【问题讨论】:

  • R.T 是一个始终返回true 的函数,因此对于R.cond,它在典型的switch 子句(命令式语言)中基本上等于default
  • 也许看看the implementation 有帮助,它很小。
  • 这可能会更清楚:ramdajs.com/0.21.0/docs/#T。你看到的 else case 只是另一个 case 语句。正是谓词,以及它在最后一个位置的事实,使它表现得像一个默认值。

标签: javascript functional-programming ramda.js


【解决方案1】:

R.T 总是返回 true 并忽略传递给它的任何参数。 这就是您传入的100 被忽略并返回true 的原因。

R.cond 搜索每个 [predicate, transform] 对,并停止搜索计算结果为 true 的第一个谓词。 因此将评估 [predicate, transform] 对中的第一个匹配实体。

如果什么都不是true,则它到达末尾并执行R.T 谓词(始终为true),其作用类似于列表的else 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2013-05-01
    • 2017-08-20
    • 2019-04-09
    • 2017-02-05
    相关资源
    最近更新 更多