浅谈柯里化 http://zoo.zhengcaiyun.cn/blog/article/currying
背景:
在 react 项目中使用 antd 表单的时候,遇到一些老项目,需要校验密码的强弱、校验输入的规则等,如果每次都是传正则和需要校验的字符串,有点麻烦。
代码语言:javascript复制import React from "react";
const accountReg = /^[a-zA-Z0-9_-]{4,16}$/;
const passwordReg = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?d)(?=.*?[!@#$])[a-zA-Zd!@#$]{10,16}$/;
const FormCom = () => {
const checkReg = (reg, txt) => {
return reg.test(txt)
}
//账号
const checkAccount = (event) => {
checkReg(accountReg, event.target.value);
// 其他逻辑
};
//密码
const checkPassword = (event) => {
checkReg(passwordReg, event.target.value);
// 其他逻辑
};
...
// 省去其他函数校验
render() {
return (
<form>
账号:
<input onChange={checkAccount} type="text" name="account" />
密码:
<input onChange={checkPassword} type="password" name="password" />
</form>
);
}
}
export default FormCom;
我们怎么解决类似的问题呢,我们可以使用柯里化函数来解决类似的问题。当然属于个人观点,如果其他方法,欢迎提出,进行学习
代码语言:javascript复制import React from "react";
const accountReg = /^[a-zA-Z0-9_-]{4,16}$/;
const passwordReg = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?d)(?=.*?[!@#$])[a-zA-Zd!@#$]{10,16}$/;
const FormCom = () => {
// 柯里化封装
const curryCheck = (reg) => {
return function(txt) {
return reg.test(txt)
}
}
//账号,这样就省去了一个参数的传递
const checkAccount = curryCheck(accountReg);
//密码,这样就省去了一个参数的传递
const checkPassword = curryCheck(passwordReg);
const checkAccountFn = () => {
checkAccount(event.target.value);
// 其他逻辑
}
const passwordFn = (event) => {
checkPassword(event.target.value);
// 其他逻辑
};
...
// 省去其他函数校验
render() {
return (
<form>
账号:
<input onChange={checkAccountFn} type="text" name="account" />
密码:
<input onChange={passwordFn} type="password" name="password" />
</form>
);
}
}
export default FormCom;
一、柯里化
在计算机科学中,柯里化(英语:Currying ),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是 Moses Schönfinkel 和戈特洛布·弗雷格发明的。柯里化其实也是函数式编程的思想。下面来举例说明什么是柯里化呢?
下面例子求和的过程,就是一个“乞丐版”的柯里化的过程
代码语言:javascript复制 const addFn = (x, y, z) => {
return x y z;
};
const addResultFn = addFn(1, 2, 3);
console.log("