如何像.Net 中的 lambda 表达式那样发“ = >”的音

我很少见到其他程序员!

当我第一次看到这个符号时,我的想法是“暗示”,因为这就是它在数学证明中的解读,但这显然不是它的意义所在。

那么我该如何说或读取“ = >”,如:-

IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

或者有没有一个公认的说法?

34220 次浏览

我通常在读那个操作符时说“这样”。

在您的示例中,p = > p. Age > 16读作“ P,这样 p 年龄大于16。”

事实上,我在官方的 linq 发布前论坛上问了这个问题,安德斯·海尔斯伯格回答说

我通常将 = > 操作符读作“成为”或“为了什么”,
函数 f = x = > x * 2;
Func test = c = > c. City = = “ London”;
读作“ x 变成 x * 2”和“ c,其中 c 城市等于伦敦”

至于“去”,这对我来说从来都没有意义。“ p”不会去任何地方。

在通过电话向别人读代码的情况下,只要他们是 C # 程序员,我就会用“ lambda”这个词,也就是“ p lambda p. age 大于16”

在评论中,Steve Jessop 提到了转换的“映射到”——以 Anders 为例:

x => x * 2;

会读

X 映射到 x 乘以2。

在这种情况下,这似乎比“成为”更接近代码的实际意图。

我见过有人说“绿箭”

我使用“ goes to”是因为一本 LINQ 的书告诉我:)

问题的一部分在于你可以根据它的结构大声读出不同的内容。可惜没有 Ruby 的那么漂亮,那么完整。

除了获取前面的作用域(在 lambda 表达式出现的地方,正常代码行的作用域中的所有变量和常量都可用于表达式的代码) ,lambda 表达式本质上是内联函数的语法糖。

生产操作符左边的值列表(“ = >”)提供了用于调用此函数的堆栈帧的结构和内容。可以说,值列表同时提供了参数声明和传递的参数; 在更传统的代码中,这些参数决定了用于调用函数的堆栈框架的结构和内容。

因此,这些值“转到”表达式代码。您更愿意说“定义堆栈框架”还是“去”?:)

在狭义的布尔表达式用作过滤条件的应用中(主要使用 lambda 表达式,这个问题的其他答案广泛考虑) ,为了代码的意图而跳过方法是非常合理的,这导致“ for which”同样简洁,并且更多地说明了代码的意义。

然而,lambda 表达式并不是 Linq 的唯一领域,在这个上下文之外,应该使用更一般的形式“ go to”。


但为什么是“去”?

因为“填充以下代码的堆栈框架”太长了,不能一直说下去。我想你可以说“是/被传递”。

显式传递的参数和捕获的变量(如果我没记错的话——如果我错了就纠正我)之间的一个关键区别是,前者是通过引用传递的,而后者是通过值传递的。

我没有想太多,但我只是简单地说“到”。它简洁明了,并且暗示变量传递 表达式。我想它可能会与数字2(“2”)混淆,但是我在说话的时候倾向于把“ to”发得更像“ ta”。从来没有人(至少知道 lambdas 的人)告诉我,他们认为它模棱两可... ..。

// "Func f equals x to x times two"
Func f = x=> x * 2;


// "Func test equals c to c dot City equals London"
Func test = c => c.City == "London"

来自 MSDN:

所有的 lambda 表达式都使用 lambda 运算符 = > ,读作“ goes” 到”。

我的简短回答是: “ c‘ lambda-of’e”。虽然我坚持“ lambda’c‘ function’e”,但我认为 lambda-of 是基督教的妥协。分析如下。

这是一个伟大的问题,即使只是为了奇怪的答案。大多数的翻译有其他意义,而不是对 lambda 表达,导致异国情调的解释。作为一个老 Lambda 表达式黑客,我只是忽略。NET 符号,并重写它为 lambda 在我的头脑中,同时希望他们已经做了几乎任何其他这一点。


对于在电话中叙述代码,您希望有人能够按顺序写下代码。这当然是个问题,但是 lambda-Arrow 或者别的什么可能是你能得到的最好的,或者也许 lambda-in,但是 lambda-of 是最准确的。

问题是中缀的用法,以及如何命名整个东西和左右部分的作用,这些东西在中缀位置说话时起作用。

这可能是一个过度约束的问题!


我不会使用“这样”,因为这意味着右边是谓词,左边应该满足。这与讨论将左侧抽象为函数参数的右侧非常不同。(MSDN 关于“所有 lambda 表达式”的声明简直是冒犯,也是不准确的。)

有些东西对“去”感到不满,尽管它可能是我们所能得到的最接近的东西。“ Goes to”意味着一个转换,但是在 c 中并没有一个变量 c 可以转换成一个表达式。对函数的抽象有点难以捉摸。我可能已经习惯了这一点,但我仍然渴望一些强调变量抽象的东西。

因为在目前使用的情况下,左边总是一个简单的标识符(但等待扩展,这可能会在以后混淆) ,我认为对于“ c = > expression”,我会读作“ c‘ lambda-function’expression”,甚至“ c‘ arg’‘ function’expression”。在最后一种情况下,我可以说“ b‘ arg’c‘ arg’‘ function’expression”。

更明确地说明引入了 lambda 表达式,并说出类似于“‘ arg’b‘ arg’c‘ function’表达式”的内容,可能会更好。

弄清楚如何将所有这些翻译成其他语言是学生的一个练习[ ; <)。

我仍然担心“(b,c) = > 表达式”和其他可能出现的变体,如果它们还没有出现的话。也许是“‘ args’b,c‘ function’表达式”。


在所有这些沉思之后,我注意到我开始把“ c = > e”翻译成“‘ lambda’c‘ function’e”,并注意到到精确形式的映射需要通过上下文来理解: λc (e) ,c = > e,f 哪里 f (c) = e 等。

我认为“ go-to”解释会占上风,因为这是占主导地位的大多数人第一次看到 lambda 表达式的地方。真可惜。一个好的折衷方案可能是“ c‘ Lambda-of’e”

我一直叫它“王操作员”: -)

“ p 王年龄 p 大于16”

“地图”怎么样?与其他替代方案相比,它既简洁又在技术上可以说更准确(例如,没有建议状态改变为“去”或“成为”,没有将一个集合与其特征函数合并为“这样”或“为了哪个”)。不过,如果已经有一个 MSDN 页面所暗示的标准,也许您应该直接使用它(至少对于 C # 代码是这样)。

“ Maps to”是我的首选发音。从数学上讲,一个函数将它的参数“映射”到它的返回值(有人甚至可能称这个函数为“映射”) ,所以在编程中使用这个术语对我来说是有意义的,特别是在函数式编程(尤其是 lambda 演算)非常接近数学的情况下。它也比“成为”、“去”等更中性,因为它不像上下文无关提到的那样暗示状态的改变。

如果你把 lambda 表达式想象成匿名方法,那么“ goes to”就足够了。

(n => n == String.Empty)

N“ goes to”表达式 n = = String. Empty。

它指向匿名方法,所以您不必转到代码中的方法!

对不起。

说实话,我不喜欢在脑子里使用“ go to”这个词,但是我看到其他人说这个词看起来很奇怪,我想我应该澄清一下。

在 Ruby 中,同样的 sybmol 被称为“ hashRocket”,我听说 C # 程序员也使用这个术语(尽管这样做是错误的)。

我的建议是:

s => s.Age > 12 && s.Age < 20

“带参数 s 的 Lambda 表达式为{ return s.Age > 12 && s.Age < 20;}”

我喜欢这个,因为它让我想起了兰巴的表情是从哪里来的

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

= > 只是一个快捷方式,因此您不必使用 committee 关键字并包含类型信息,因为它可以由编译器推断出来。

我的术语 = > 应用于显示的结果示例

'result = s => s.Age > 12 && s.Age < 20'

年龄大于12岁和年龄小于20岁的

'result = x => x * 2'

其中 x 乘以2

'result = c => c.City == "London"'

其中 c.city 相当于“ London”

'result = n => n == String.Empty'

其中 n 是一个空字符串