Ramda replace函数占位符语法疑问:{name}匹配与插值原理
这个例子的核心是Ramda的柯里化特性和占位符R.__,{name}本身就是普通字符串,没什么特殊魔法,一步步拆给你看:
Ramda函数的自动柯里化
Ramda的所有工具函数都是自动柯里化的——如果不传入函数要求的所有参数,它会返回一个新函数,等你补全剩余参数。比如R.replace的完整调用逻辑是R.replace(匹配模式, 替换值, 目标字符串),需要三个参数。占位符
R.__的作用R.__是Ramda的占位符,用来占住某个参数位置,表示“这个位置的参数我之后再传”。你写的R.replace('{name}', R.__, 'Hello, {name}!'),相当于提前传入了第一个参数(要匹配的字符串'{name}')和第三个参数(目标字符串'Hello, {name}!'),只留下第二个参数(替换值)的位置空着。最终调用的逻辑
所以greet其实是一个等待接收替换值的函数,当你调用greet('Alice')时,'Alice'会被填入R.__占住的第二个参数位置,相当于执行:
R.replace('{name}', 'Alice', 'Hello, {name}!')
这本质上和JS原生的'Hello, {name}!'.replace('{name}', 'Alice')完全一致——这里的{name}就是普通字面量匹配,不是特殊插值语法。Ramda的replace底层直接调用了原生字符串的replace方法,所以你看Ramda源码找不到处理{name}的逻辑,因为那是JS原生自带的功能。
总结:这是Ramda柯里化+占位符的特性,{name}只是普通匹配字符串,替换逻辑靠原生JS实现。
内容的提问来源于stack exchange,提问作者Javiliano

