1.【Rematch 源码系列】四、源码Third-Party plugins
2.Presto源码分析之模式匹配
3.正则表达式怎么编写
【Rematch 源码系列】四、源码Third-Party plugins
本文深入探讨了rematch的源码两个常用第三方插件:immer与loading。immer插件旨在简化state的源码修改过程,通过引入immerjs,源码允许开发者在reducer中使用mutable状态,源码微信小程序源码免费进而生成immutable状态,源码简化了常规操作。源码immer插件的源码实现相对简单,只需将常规reducer包裹一层,源码使之通过immerjs处理即可。源码
immer插件的源码核心在于其对reducer的封装,通过immer.produce方法处理draft状态,源码简化了mutable状态的源码管理,避免了复杂的源码clone和赋值操作。当状态为简单数据类型时,不会使用immer.produce,以保持代码的简洁性。更多关于immer.produce和combineReducers的使用和原理可参考官方文档。
然而,immer插件的tpc源码设计存在缺陷,即许多reducer配置若不能以数组形式存储,而是被替换,则可能导致插件配置失效。rematch v2版本通过引入更细粒度的plugin hooks(如onReducer)解决了这一问题,提升了配置的灵活性。
紧接着是loading插件,专注于管理异步操作的状态,包括网络请求等。其核心在于onModel钩子的使用,定义了全局和模型级别的loading状态,并为特定操作定义了show和hide两个reducer,动态跟踪和控制加载状态。
loading插件的实现通过初始化代码定义了全局和模型级别的loading状态,并使用onModel钩子处理模型操作,对特定的effect动作进行管理,包装原始动作以实现状态控制。两个reducer,show和hide,分别用于增加和减少操作状态的计数,以此实现对加载状态的荆楚源码动态更新。
本文综述了rematch的immer和loading插件的实现原理、使用场景及优化策略,为开发者提供了深入理解这些工具的框架。后续文章将探讨rematch v1升级到v2的设计变化以及TypeScript支持的实现,期待与开发者共同探索rematch的最新进展和优化。
Presto源码分析之模式匹配
Presto 中的小型模式匹配库,即presto-matching,其作用在于识别并优化性能不佳的查询计划。本文将详细解析presto-matching库中的主要概念,包括Pattern、Match、Matcher,以及它们的设计思路与在Presto查询优化中的应用。
首先,Pattern是一个抽象类,它负责定义模式的结构、行为、常用构造方法,形成了小型的DSL,并提供与匹配逻辑之间的boyidashimfi源码桥梁方法matches。Pattern的结构定义了模式的属性,如EqualsPattern的expectedValue和FilterPattern的predicate。Pattern的行为通过accept方法实现,它接受Matcher核心类和匹配对象,以及用于保存匹配过程中关注的节点的Context。Pattern还定义了模式构造方法,使用户可以直观地描述复杂的匹配逻辑,避免冗长且难以理解的代码。
Pattern匹配的关键在于Pattern的matches方法,它用于判断给定对象是否能匹配当前模式。
Pattern的子类包括5个,分别用于实现不同的匹配逻辑。
Match是一个抽象类,代表匹配结果,包含Present和Empty两个私有实现类。Present类保存匹配到的节点,Empty类表示未匹配到任何内容。用户通过Match的工厂方法获取具体的实现类。
Matcher作为桥梁,使用Visitor模式,退出源码定义了匹配各种模式的方法。当前实现仅有一个DefaultMatcher,它通过递归调用match方法,检查整个模式链是否满足给定对象,同时保存用户感兴趣的子节点。
模式匹配在Presto中的应用主要在于查询优化,特别是在基于规则的优化器中。例如,Presto的优化规则推限通过项目可以利用模式识别找到性能提升的机会,通过在选择阶段减少数据量,从而减少整个查询的处理数据量。
本文对presto-matching库进行了深入解析,从其设计思路到实际应用,展现了模式匹配在Presto查询优化中的重要作用。这个库的设计虽然简洁,但在查询优化场景中发挥了巨大作用。它不仅提高了查询性能,还为未来的类似模式识别场景提供了灵活的应用基础。
正则表达式怎么编写
<%
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches '建立变量。
Set regEx = New RegExp '建立正则表达式。
regEx.Pattern = patrn '设置模式。
regEx.IgnoreCase = True '设置是否区分字符大小写。
regEx.Global = True '设置全局可用性。
Set Matches = regEx.Execute(strng) '执行搜索。
For Each Match in Matches '遍历匹配集合。
RetStr = RetStr & "Match found at position "
RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
RetStr = RetStr & Match.Value & "'." & "<BR>"
Next
RegExpTest = RetStr
End Function
response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4")
%>
在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下:
Match found at position 0. Match Value is 'IS1'.
Match found at position 4. Match Value is 'Js2'.
Match found at position 8. Match Value is 'IS3'.
Match found at position . Match Value is 'is4'.
下面我们就介绍这三个对象和集合。
1、RegExp对象是最重要的一个对象,它有几个属性,其中:
○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。
○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 False。
○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。
2、Match 对象
匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。
○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0
○Length 属性,返回在字符串搜索中找到的匹配的长度。
○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。
3、Matches 集合
正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。
学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。
1、Replace 方法
替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。
<%
Function ReplaceTest(patrn, replStr)
Dim regEx, str1 ' 建立变量。
str1 = "The quick brown fox jumped over the lazy dog."
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分大小写。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
End Function
Response.write ReplaceTest("fox", "cat") & "<BR>" ' 将 'fox' 替换为 'cat'。
Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对.
%>
2、Test 方法
对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。
<%
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = False ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
If retVal Then
RegExpTest = "找到一个或多个匹配。"
Else
RegExpTest = "未找到匹配。"
End If
End Function
Response.write RegExpTest("is.", "IS1 is2 IS3 is4")
%>
3、Execute 方法
对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
2024-11-27 00:17
2024-11-27 00:13
2024-11-27 00:00
2024-11-26 23:56
2024-11-26 23:38
2024-11-26 23:33
2024-11-26 23:10
2024-11-26 23:04