不可变集合上的非可变“添加”方法的最佳名称是什么? [关闭]

2024-02-07

抱歉这个华夫饼的标题——如果我能想出一个简洁的标题,我就不必问这个问题了。

假设我有一个不可变的列表类型。它有一个操作Foo(x)它返回一个新的不可变列表,其中指定的参数作为末尾的额外元素。因此,要构建一个包含值“Hello”、“immutable”、“world”的字符串列表,您可以编写:

var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");

(这是 C# 代码,如果您认为该语言很重要,我对 C# 建议最感兴趣。这从根本上来说不是一个语言问题,但该语言的习惯用法可能很重要。)

重要的是现有的列表是not改变为Foo - so empty.Count仍然会返回 0。

获得最终结果的另一种(更惯用的)方法是:

var list = new ImmutableList<string>().Foo("Hello")
                                      .Foo("immutable")
                                      .Foo("word");

我的问题是:Foo 最好的名字是什么?

EDIT 3:正如我稍后透露的,该类型的名称实际上可能不是ImmutableList<T>,这使得立场明确。想象一下,它是TestSuite它是不可变的,因为它所属的整个框架是不可变的......

(编辑3结束)

到目前为止我想到的选项:

  • Add:在 .NET 中很常见,但意味着原始列表的变化
  • Cons:我相信这是函数式语言中的正常名称,但对于那些没有此类语言经验的人来说毫无意义
  • Plus:到目前为止我最喜欢的,这并不意味着突变to me。显然这也是在哈斯克尔中使用 http://en.wikibooks.org/wiki/Haskell/MonadPlus但期望略有不同(Haskell 程序员可能期望它将两个列表添加在一起,而不是向另一个列表添加单个值)。
  • With:与其他一些不可变约定一致,但在我看来没有完全相同的“附加性”。
  • And: 不太描述。
  • + 的运算符重载:我真的不太喜欢这个;我通常认为运算符应该只应用于较低级别的类型。但我还是愿意被说服!

我选择的标准是:

  • 给出方法调用结果的正确印象(即,它是带有额外元素的原始列表)
  • 尽可能清楚地表明它不会改变现有列表
  • 当像上面的第二个例子一样链接在一起时听起来很合理

如果我说得不够清楚,请询问更多细节......

EDIT 1:这是我选择的理由Plus to Add。考虑这两行代码:

list.Add(foo);
list.Plus(foo);

在我看来(以及这个is个人的事情)后者显然有错误 - 就像写“x + 5;”作为其本身的声明。第一行看起来没什么问题,直到您记住它是不可变的。事实上,加号运算符本身不会改变其操作数是另一个原因Plus是我最喜欢的。没有操作符重载的轻微恶心,它仍然给出相同的含义,其中包括(对我来说)不改变操作数(或本例中的方法目标)。

EDIT 2:不喜欢的原因添加。

各种答案都有效:“选择 Add。这就是DateTime确实如此,并且String has Replace方法等不会使不变性变得明显。”我同意 - 这里有优先权。但是,我看到很多人打电话DateTime.Add or String.Replace and 期待突变。有很多新闻组问题(如果我仔细研究的话,可能还有这样的问题),这些问题的答案是“你忽略了String.Replace;字符串是不可变的,返回一个新字符串。”

现在,我应该揭示这个问题的微妙之处——类型可能not实际上是一个不可变列表,但是是不同的不可变类型。特别是,我正在开发一个基准测试框架,您可以在其中将测试添加到套件中,然后创建一个新套件。很明显:

var list = new ImmutableList<string>();
list.Add("foo");

不会完成任何事情,但它会成为lot当你将其更改为时更加模糊:

var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);

这么看来应该没问题了。然而,对我来说,这使错误更加清晰:

var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);

这只是乞求:

var suite = new TestSuite<string, int>().Plus(x => x.Length);

理想情况下,我希望我的用户不必被告知测试套件是不可变的。我希望他们掉进成功的深渊。这may不可能,但我想尝试一下。

我很抱歉通过仅讨论不可变列表类型来过度简化原始问题。并非所有集合都像ImmutableList<T> :)


在这种情况下,我通常会选择Concat。对我来说,这通常意味着正在创建一个新对象。

var p = listA.Concat(listB);
var k = listA.Concat(item);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不可变集合上的非可变“添加”方法的最佳名称是什么? [关闭] 的相关文章

  • Python 3 中的递归搜索 JSON/DICT

    我在 Python 3 中实现了一些 API 这些 API 允许我根据班级代码接收有关学校的信息 但我想知道如何通过类代码获取信息 例子 我输入代码GF528S我希望程序告诉我班级 3C INF 地址 Address 1 Milan 如果可
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • C# 如何单击 IList 中的 IWebelement?

    所以我尝试单击 YouTube 上的按钮 但我无法通过 Xpath 找到该按钮 因为按钮太多 所以我尝试将它们保存在 IList 中 现在我想单击列表中的特定按钮 ChromeDriver chrome new ChromeDriver L
  • 使用私有自动属性而不是简单变量来实现编程标准

    在与同行的讨论中 有人提出我们应该考虑对所有类级别变量使用自动属性 包括私有变量 因此 除了这样的公共财产之外 public int MyProperty1 get set 我们的私有类级变量如下所示 private int MyPrope
  • Django查询:如何过滤对象以排除列表中的id?

    如何在查询中进行过滤 以便结果排除 ID 属于列表的任何对象实例 可以说我有 object id list 1 5 345 MyObject objects filter Q time gte datetime now Q what to
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • Erlang:如何将原子转换为字符串?

    我想从原子转换为字符串 Input hello world Output hello world 我该如何实现这一目标 Use atom to list http erlang org doc man erlang html atom to
  • 两个程序对象运行时比较的方法

    我正在进行一种特定类型的代码测试 该测试相当麻烦并且可以自动化 但我不确定最佳实践 在描述问题之前 我想澄清一下 我正在寻找合适的术语和概念 以便我可以阅读有关如何实现它的更多信息 当然 欢迎就最佳实践提出建议 但我的目标很具体 这种方法叫
  • Backbone Marionette CompositeView 排序列表 - 在添加时呈现额外的模型

    这是小提琴 http jsfiddle net QhQ8D 10 http jsfiddle net QhQ8D 10 代码在下面 制作一个聊天应用程序 需要一个排序的 连接的用户列表 名称上带有比较器的图形集合连接到 CompositeV
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但
  • 验证假名输入

    我正在开发一个允许用户输入日语字符的应用程序 我试图想出一种方法来确定用户的输入是否是日语假名 平假名 片假名或汉字 应用程序中的某些字段不适合输入拉丁文文本 我需要一种方法将某些字段限制为仅限汉字或仅限片假名等 该项目使用UTF 8编码
  • Objective-C 中是否有命名初始化方法的约定?

    在可以通过不同的 init 方法初始化的 Objective C 类中 将所有初始化程序共用的初始化代码收集到一个从其他 init 方法 有时也从从 Nib 唤醒 是否有关于如何命名该方法的约定 初始化器 初始化公共 根据 Apple 的说
  • 将字符串连接到python列表中所有元素的末尾

    我想知道如何将字符串连接到列表中所有元素的末尾 例如 List1 1 2 3 string a output 1a 2a 3a 在列表理解和使用中重建列表str format在两个参数上 gt gt gt string a gt gt gt
  • 您在 Java 项目中使用什么策略进行包命名?为什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我不久前就想过这个问题 最近当我的商店正在开发第一个真正的 Java Web 应用程序时 这个问题又重新出现了 作为介绍 我看到两个主要的包命名
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 在数字集合中查找最接近的匹配[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一
  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我

随机推荐

  • .Net 中的钥匙锁

    我有一个 Azure 服务总线队列 我正在其中接收 1 到 10 条具有相同 密钥 的消息 其中一条消息需要通过长时间运行的操作来处理 完成后 数据库将被更新 其他消息将对其进行检查 但是 与此同时 其他消息将重新排队 以便进程不会丢失 但
  • 图像中的第四个通道是什么?

    使用随机生成图像时该列意味着什么np random randint img np random randint 255 size 4 4 3 dtype uint8 这将创建一个 4 x 4 像素 3 列的矩阵 img np random
  • 在 Clojure 中获取函数的参数类型提示

    我正在寻找提取函数参数的类型提示信息 但我似乎找不到访问该信息的方法 例如 假设我有以下功能 defn Double do something String a String b 5 0 拉取标签很简单 tag meta do someth
  • 这些“未定义引用 __glut*WithExit”OpenGL 链接器错误的含义是什么? [复制]

    这个问题在这里已经有答案了 原问题 警告 路过GLfloat for converting 2 of空白 glutSolidSphere GLdouble GLint 闪烁 警告 路过GLfloat for converting 3 of空
  • Swift 中多维数组的语法是什么?

    CO 粉丝 在你下结论之前 它是一个重复的 有 2 种不同风格的数组 看来我问的是不太受欢迎的一种 到目前为止 我只看到了锯齿状数组的语法 例如 Int 但我找不到任何有关平面多维数组的信息 那么类型的语法是什么 比如二维数组Ints 以及
  • 如何使用 Javascript/underscorejs 找到包含对象的数组的交集?

    我不知道如何找到这组数组的交集 name product1 light 1 name product2 light 2 name product5 light 5 name product4 light 4 name product2 li
  • 如何将数据数组导入到 Hive 表中的单独行中?

    我正在尝试将以下格式的数据导入配置单元表 identifier id 1 dataA dataA 1 identifier id 2 dataA dataA 2 我有多个这样的文件 我希望每个 在表中形成一行 这是我尝试过的 CREATE
  • 图形解析错误

    我尝试使用 python 和 igraph 库创建 graphml 文件 我可以构建 igraph 的图形对象并将其写入文件 g write graphml mygraph graphml 一切似乎都很成功 但是当我尝试使用以下命令将文件读
  • 在java中解析XML属性

    我有一个与此类似的xml
  • 为什么GD在imagedestroy()时不释放内存?

    我需要一个 PHP CLI 脚本来通过 GD 函数执行各种图像转换 图像很大 所以我需要压缩尽可能多的内存 然而 当被要求时 imagedestroy 似乎不会释放内存 考虑以下演示脚本 test php usr bin php5
  • C#中如何使用“using”捕获异常

    鉴于此代码 using var conn new SqlConnection conn Open using var cmd conn CreateCommand cmd CommandText using var reader cmd E
  • 为什么进程在 4GB 时被杀死?

    我编写了一个可以处理大量数据的程序 我的 CPU 和操作系统 Ubuntu 都是 64 位的 并且我有 4GB 的 RAM 使用 top Mem 字段 我看到该进程的内存消耗上升到 87 左右 即 3 4 GB 然后它被杀死 然后我使用 u
  • JSF h:inputText 验证和 f:ajax 渲染

    一个非常简单的 JSF 应用程序 InputText 元素分配有 Validator f ajax 用于渲染下一个元素 phoneNumber 方法是使用blur event 仅当 inputText 通过验证器且 isValid 布尔值设
  • 如何使用 Visual Studio x64 进行编译?

    我想从bat 文件在VS2008 x64 中编译 当我在 VS2008 32 位中编译时 我调用 vsvars32 bat 我需要调用什么才能在 x64 中进行编译 现在建议不要使用vsvar32 bat并使用SetEnv cmd而是设置您
  • 发现长模式

    给定一个排序的数字列表 我想找到最长的子序列 其中连续元素之间的差异呈几何级数增加 所以如果列表是 1 2 3 4 7 15 27 30 31 81 那么子序列是1 3 7 15 31 或者考虑1 2 5 6 11 15 23 41 47其
  • 检查 Javascript 数组值是否按升序排列

    假设我有一个 Javascript 整数数组 我想检查它的所有值是否都按升序排列 我想要的是将数组键保存在另一个数组中 以防算法发现一个较低 或等于 的值 不仅比较前一个值 而且还比较它之前的任何值 我所做的是这样的 arr nonvali
  • 匹配大文本文件中的字符串?

    我有一个字符串列表 其中包含大约 700 万个项目 大小为 152MB 的文本文件 我想知道实现 a 函数的最佳方法是什么 该函数接受单个字符串并返回它是否在该字符串列表中 您是否需要多次匹配此文本文件 如果是这样 我会创建一个HashSe
  • 日期格式 dd\mm\yyyy 的正则表达式是什么?

    日期格式 dd mm yyyy 的正则表达式是什么 我无法找到这种格式的正则表达式 模式 dd mm yyyy 的正则表达式 String regex 0 2 0 9 3 0 1 0 0 9 1 0 2 0 9 0 9 0 9 0 9
  • 在 Objective-C 中设置文件权限

    我设法得到了一个漂亮的 ftp 对象 它的级别非常低并且很容易适应 我使用它通过 FTP 将文件从一台 Mac 传输到另一台 Mac 现在 我遇到的问题是 当传输的文件到达目的地 另一台 Mac 时 访问权限会以随机间隔设置为 所有人 无访
  • 不可变集合上的非可变“添加”方法的最佳名称是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动