ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Humanizer Plurality 枚举详解:如何在 .NET 文本变形中表达单数、复数与未知复数性

Humanizer Plurality 枚举详解:如何在 .NET 文本变形中表达单数、复数与未知复数性 开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载本文以 Humanizer 公共 API 中的Plurality枚举为切入点系统讲解其三个成员Singular、Plural、CouldBeEither的定义、数值与语义并结合仓库源码Plurality.cs、Vocabulary.cs与测试用例说明 Humanizer 是如何在词形变换复数化/单数化中处理未知复数性这一场景的。读完本文你将掌握该枚举的准确含义、底层调用机制以及在实际代码中如何规避双重复数化或错误单数化。一、Plurality枚举是什么Plurality是 Humanizer 定义在Humanizer命名空间下的一个公共枚举位于 src/Humanizer/Plurality.cs。它的作用正如其 XML 文档注释所述为 Humanizer 提供一个关于某个词是单数、复数还是复数性未知的提示Provides hint for Humanizer as to whether a word is singular, plural or with unknown plurality。从源码看其完整定义如下namespace Humanizer; /// summary /// Provides hint for Humanizer as to whether a word is singular, plural or with unknown plurality /// /summary public enum Plurality { /// summary /// The word is singular /// /summary Singular, /// summary /// The word is plural /// /summary Plural, /// summary /// I am unsure of the plurality /// /summary CouldBeEither }该枚举被纳入 Humanizer 的公共 API 契约在 PublicApiApprovalTest.Approve_Public_Api.DotNet8_0.verified.txt 等 API 验收快照中均有登记说明它是库面向使用者的稳定公共类型之一。三个成员的语义与取值官方 API 文档Humanizer.Plurality.md对每个字段给出了明确说明整理如下成员数值语义说明Plurality.Singular0该词是单数The word is singularPlurality.Plural1该词是复数The word is pluralPlurality.CouldBeEither2无法确定词的复数性I am unsure of the plurality值得注意的是由于枚举默认从0开始按声明顺序递增Singular同时是default(Plurality)的值CouldBeEither是一个三态设计中用于表达不确定性的特殊状态——它既不代表单数也不代表复数而是告诉下游逻辑我不确定请自行判断或采取兜底策略。二、从源码看未知复数性是如何被处理的Plurality枚举本身是一个轻量的状态标记而 Humanizer 真正处理复数性未知的核心逻辑集中在词形变换引擎 Vocabulary.cs 中。在 Vocabulary.cs 的Singularize方法里源码直接以注释点明了这一设计意图// the Plurality is unknown so we should check all possibilities这句注释所在的分支对应Singularize(string? word, bool inputIsKnownToBePlural true, bool skipSimpleWords false)方法中inputIsKnownToBePlural为false的情形当调用者不确定输入词是否为复数时引擎不会直接套用单数化规则而是先尝试按复数规则反向推导ApplyRules(plurals, ...)再与单数化结果相互印证从而避免把本身就正确的单词改错。对称地Pluralize 方法 也提供了bool inputIsKnownToBeSingular true参数当调用者不确定输入词是否为单数时同样会先做一轮按复数规则处理→再按单数规则回推的交叉校验见 Vocabulary.cs防止把已经是复数的词再次复数化。从源码结构可以推断Plurality.CouldBeEither所代表的不确定概念在实际调用链中正是通过inputIsKnownToBeSingular: false/inputIsKnownToBePlural: false这两个布尔参数来落地的。面向使用者的扩展方法入口普通开发者通常不会直接接触Vocabulary而是使用 InflectorExtensions.cs 中的字符串扩展方法public static string? Pluralize(this string? word, bool inputIsKnownToBeSingular true) Vocabularies.Default.Pluralize(word, inputIsKnownToBeSingular); public static string Singularize(this string word, bool inputIsKnownToBePlural true, bool skipSimpleWords false) Vocabularies.Default.Singularize(word, inputIsKnownToBePlural, skipSimpleWords);这两个扩展方法直接透传是否已知复数性的标志位到Vocabulary引擎Vocabularies.Default为默认词汇表实例定义于 Vocabularies.cs。三、实战如何在不确定复数性时安全调用对应Plurality三态中的确定与不确定两类场景代码写法应做如下区分。1. 确定输入是单数 → 默认行为默认参数inputIsKnownToBeSingular: true表示信任输入直接套用复数化规则person.Pluralize(); // people cat.Pluralize(); // cats box.Pluralize(); // boxes man.Pluralize(); // men meter per second.Pluralize(); // meters per second PERSON.Pluralize(); // PEOPLE这些示例正是 InflectorExtensions.cs 文档注释中官方给出的行为。2. 不确定输入是单数还是复数 → 显式声明当输入可能已经是复数时应把标志位设为false相当于告诉引擎复数性未知此时引擎会执行交叉校验以避免双重复数化cats.Pluralize(inputIsKnownToBeSingular: false); // cats避免变成 catses person.Pluralize(inputIsKnownToBeSingular: false); // people单数化方向同理people.Singularize(); // person cats.Singularize(); // cat boxes.Singularize(); // box meters per second.Singularize(); // meter per second person.Singularize(inputIsKnownToBePlural: false); // person避免错误改写其中 person 在inputIsKnownToBePlural: false下保持原样正是 InflectorExtensions.cs 注释强调的avoids incorrect singularization。3. 跳过简单词skipSimpleWordsSingularize还额外提供skipSimpleWords参数用于跳过以 s 结尾的简单词的单数化。测试用例 InflectorTests.cs 给出了典型场景tires.Singularize(skipSimpleWords: true); // tires body.Singularize(skipSimpleWords: true); // bodies规则仍生效 traxxas.Singularize(skipSimpleWords: true); // traxxas四、测试如何验证未知复数性行为Humanizer 的测试套件专门覆盖了与CouldBeEither语义对应的未知复数性/单数性分支见 tests/Humanizer.Tests/InflectorTests.cs[Theory] [ClassData(typeof(PluralTestSource))] public void PluralizeWordsWithUnknownPlurality(string singular, string plural) { Assert.Equal(plural, plural.Pluralize(false)); Assert.Equal(plural, singular.Pluralize(false)); } [Theory] [ClassData(typeof(PluralTestSource))] public void SingularizeWordsWithUnknownSingularity(string singular, string plural) { Assert.Equal(singular, singular.Singularize(false)); Assert.Equal(singular, plural.Singularize(false)); }这两组测试的断言逻辑可以概括为未知复数性无论是把单数还是复数输入传给Pluralize(false)结果都必须是正确的复数形式未知单数性无论是把复数还是单数输入传给Singularize(false)结果都必须是正确的单数形式。也就是说不确定绝不意味着碰运气而是要求引擎在双向校验后仍然给出确定且正确的词形。此外InflectorTests.cs 中的SingularizeDoesNotRewriteUnrelatedWordsEndingInMen测试还验证了在inputIsKnownToBePlural: false下abdomen、specimen、Pacmen等以men结尾但与man/men无关的词不会被误改写——这正是未知复数性分支采用交叉校验而非盲目套规则的原因。五、使用建议与边界说明能用确定就不要用不确定默认参数已覆盖大多数输入为单数/复数的确定场景性能与可预期性最好只有数据来源不可控如用户输入、外部文本时才需要把inputIsKnownToBe*置为false。Plurality枚举与布尔参数的关系从当前仓库源码结构看Plurality枚举在公共 API 层面承担复数性三态的语义定义而词形变换 API 目前通过inputIsKnownToBeSingular/inputIsKnownToBePlural两个布尔参数表达同一概念Plurality.CouldBeEither对应的正是这两个参数为false时的未知状态。不规则词与不可数词Vocabulary内置了不规则词与不可数词表如meter per second在 InflectorTests.cs 中被验证为不可数这些词的未知复数性处理同样走上述交叉校验路径。大小写保持引擎在套用规则后会通过MatchUpperCase恢复输入的大小写风格如PERSON.Pluralize() PEOPLE该行为由 Vocabulary.cs 中的MatchUpperCase(word, result)保证。如果你需要自定义词形规则或注册新的词汇表可进一步阅读 Vocabulary.cs 与 Vocabularies.cs 的源码实现并结合 InflectorTests.cs 的测试模式来验证自定义行为。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Hindsight Go 客户端实战从 Retain/Recall/Reflect 到 Nullable 字段与错误处理的完整指南Hindsight Go 客户端实战从 Retain/Recall/Reflect 到 Nullable 字段与错误处理的完整指南 本文基于 Hindsigh开发工具Humanizer 中 GrammaticalGender 枚举详解跨文化控制数字词性与序数词性形的机制Humanizer 中 GrammaticalGender 枚举详解跨文化控制数字词性与序数词性形的机制 本篇围绕 Humanizer 仓库文档 Humani开发工具VictoriaMetrics 故障排查实战指南查询异常、摄入缓慢、慢查询与集群不稳定的系统性定位方法VictoriaMetrics 故障排查实战指南查询异常、摄入缓慢、慢查询与集群不稳定的系统性定位方法 本文基于 VictoriaMetrics 官方故障排查开发工具上一篇vscode-drawio革命性插件让SVG/PNG文件直接支持Draw.io编辑的终极指南下一篇如何从零开始打造你的Magic ePaper电子纸硬件完整DIY指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表