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


160

我很少遇到其他程序员!

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

因此,我该如何说或读“ =>”,如:

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

还是有一种商定的说法?


6
对于一个封闭的问题,120票的投票非常出色。
datps

我总是倾向于说逻辑上的“含蓄”与外表相同。
IllidanS4希望莫妮卡回到

Answers:


149

在阅读该运算符时,我通常会说“这样”。

在您的示例中,p => p.Age> 16读为“ P,因此p.Age大于16”。

实际上,我在linq正式发行论坛上问了这个问题,Anders Hejlsberg回答说

我通常将=>运算符读为“ becomes”或“ for which”。例如,
Func f = x => x * 2;
Func test = c => c.City ==“伦敦”;
读作“ x变成x * 2”和“ c.city等于伦敦的c”

至于“去”-这对我来说从来没有道理。'p'不会去任何地方。

在通过电话向某人读取代码的情况下,只要他们是C#程序员,我就只使用“ lambda”一词-也就是说,“ p lambda p点年龄大于十六。”

史蒂夫·杰索普(Steve Jessop)在评论中提到了转换时的“映射到”-因此以安德斯(Anders)为例:

x => x * 2;

会读

x映射到x乘以2。

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


1
仅当lambda用作过滤器时,这才是正确的。
安德鲁·卢维西

4
“转到”是“填充”的堆栈框架的一个不太尴尬的表示
Peter Wone

1
我真的不喜欢“ x变成x * 2”;x是输入,并且始终保持不变。以这种方式读取听起来像是分配操作。
赫尔曼

@Peter-哈,非常正确。=)@Germán-我倾向于同意,尽管我想不出更好的转换示例。也许“转变为”?
Erik Forbes

5
在这种情况下,我会说“映射到”。这样一来,人们会以为您在谈论容器是有一点风险的,但是您可以通过第一次解释来澄清这一点,即您的意思是“ lambda运算符,您知道,equals-sign-greater-比”。
史蒂夫·杰索普

56

MSDN

所有lambda表达式都使用lambda运算符=>,它被读为“ goes to”。


7
有趣。也许更有趣的是,对于VS2010版本确实如此,但是该指南已从VS2012版本中删除。
布莱尔·康拉德

@BlairConrad-当您发表评论时也许是正确的,但是现在所有当前的VS版本都有。
cp.engr 2015年

在以上答案中链接的MSDN文档中,我不再看到“ goes to”一词。我确实记得在2010年左右有一位导师告诉我,lambda函数应该读为“ goes to”,这就是我一直阅读它的方式。但是,在遇到这个问题时,将其读为“诸如此类”对我来说更有意义。
matt.fc

18

通过电话阅读代码

从埃里克·利珀特(Eric Lippert):

我个人会说c => c + 1为“见见见加一”。我听说过一些变化:

对于投影,(客户c)=> c.Name:“客户看到变成看到点名称”

对于谓词,(客户c)=> c.Age> 21:“客户看到的点年龄大于21”


在LINQ团队工作时,我最常听到“去”字样。
DamienG

15

我一直称其为“ wang运算符” :-)

“ p wang p的年龄大于16”


10
那是Numberwang!
comichael

4
你得告诉我,在地球上还有谁称其为“王”。我有一个团队成员告诉我,这是一个“王”,在我们所有人身上唯一可以找到的就是这个答案。
克里斯托弗

1
@Wartickler我来自西澳大利亚州-一直称其为wang操作员:-)
Aidos

7

我见过人们说“箭头”。


6
我希望那是个玩笑。
Jacob Carpenter

不是-我见过一样。
Erik Forbes

1
我认为说“箭头”的人的意思是:->
高拱门

6
我从未见过。听到了,也许,但是没有看到。
ctacke

在我看来,箭头似乎很合理,因为它表示代表lambda演算的箭头符号。我听说过学术类型将其称为箭头或向右箭头,我已经看到乳胶幻灯片上的Haskell代码,其中->运算符更改为箭头符号。
罗伯特2010年

7

我使用“ goes to”(去),因为一本LINQ书告诉我:)


5

“映射到”怎么样?它既简洁又可以说在技术上更准确(即,不建议像“去”或“成为”那样改变状态,不对集合及其特征函数(如“使”或“为此”进行混合))其他选择。尽管如果MSDN页面似乎已经暗示了一个标准,那么也许您应该使用它(至少对于C#代码而言)。


3

“ maps to”是我的首选发音。从数学上讲,一个函数将其参数“映射”到其返回值(甚至可以称该函数为“映射”),因此在编程中使用此术语对我来说是有意义的,尤其是作为函数编程(尤其是lambda演算)与数学非常接近。它也比“成为”,“去”等更为中立,因为它不建议状态改变,如contextfree所述。


2

我没有想太多,但是我只是简洁地说“ to”。它简短明了,暗示将变量传递表达式。我想它可能会与数字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"

2

我的简短回答是:“ c'lambda-of'e”。尽管我坚持使用“'lambda'c'function'e”,但我认为lambda-of是普遍的折衷方案。分析如下。

如果仅是奇怪的答案,这是一个很大的问题。除lambda表达式外,大多数翻译都具有其他含义,从而导致异国情调的解释。作为一个老的lambda表达式黑客,我只是忽略了.NET表示法,而是将其重写为lambda在我的脑海中,而希望他们为此做了几乎其他任何事情。


为了通过电话叙述代码,您希望某人能够按顺序写下代码。当然,这是一个问题,但是lambda-arrow或某些东西可能是您可以获得的最佳选择,或者也许是lambda-in,但lambda-of是最准确的。

问题在于infix的用法,以及如何在infix位置说出可以使用的东西命名整个事物以及左右部分的作用。

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


我不会使用“ such that”,因为这意味着右手边是左手边应满足的谓词。这与谈论将左侧抽象为功能参数的右侧截然不同。(关于“所有lambda表达式”的MSDN声明只是令人反感而且不准确。)

尽管“尽力而为”可能使我们很接近,但有些事情却使他们感到愤怒。“转到”表示转换,但是并没有确切的变量c传递给c中的表达式。对函数的抽象有点难以捉摸。我可能已经习惯了这一点,但是我仍然渴望着一些强调变量抽象的东西。

由于到目前为止,在所有情况下左侧都是一个简单的标识符[但是请等待以后可能会引起混淆的扩展名],我认为对于“ c => expression”,我会读为“ c'lambda-function'expression ”或“ c'arg''function'表达式”。在最后一种情况下,我可以说诸如“ b'arg'c'arg''function'表达式”之类的东西。

最好是更清楚地引入了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等

我希望“ goes-to”解释会流行,因为这是占主导地位的多数人第一次看到lambda表达式的地方。真可惜。一个很好的折衷方案可能是“ c'lambda- of'e”


1
“我不会使用“ that that”,因为这意味着右侧是谓语”-当它被用作谓语时,这是有效的翻译,除非我误解了您。
Erik Forbes

2

如果您将lambda表达式想象成它的匿名方法,那么“转到”就足够了。

(n => n == String.Empty)

n“转到”表达式n == String.Empty。

它转到匿名方法,因此您不必转到代码中的方法!

抱歉

老实说,我不喜欢在头脑中使用“ goes to”,但是我看到其他人说这看起来很奇怪,我想我会澄清的。


2

除了获取前面的作用域(在发生lambda表达式时在正常代码行范围内的所有变量和常量都可用于该表达式的代码)之外,lambda表达式本质上是内联函数的语法糖。

生产运算符左侧的值列表(“ =>”)构成用于对该函数进行调用的堆栈框架的结构和内容。您可以说,值列表对参数声明和所传递的参数都起作用;在更常规的代码中,它们确定用于调用函数的堆栈帧的结构和内容。

结果,值“转到”表达式代码。您是说“定义堆栈框架”还是“转到”?:)

在狭义定义的布尔表达式用作过滤条件的应用中(此问题的其他答案广泛考虑了lambda表达式的主要用法),为了支持代码的意图而跳过该方法是非常合理的,这导致“为此”,简洁明了,并详细说明了代码的含义。

但是,lambda表达式并不是Linq的唯一省份,因此在此上下文之外,应使用更通用的形式“ goes to”。


但是为什么要“去”呢?

因为“填充以下代码的堆栈框架”太长,无法继续说出来。我想您可以说“是/已传递给”。

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


1
从您的讨论中我看不出您的结论是如何得出的。另一方面,我认为在可能(或可能不会)实现闭包方面表征=>并不是解决所提出问题的好方法。
orcmid

第一段具有误导性。Lambda表达式是一流的构造。函数内联是一种优化。最后一段更是如此。Lambda表达式中的绑定变量(您称为“捕获的变量”)不会传递到任何地方。将它们装箱并添加为lambda对象的一部分。如果它们通过了,则必须重新命名-提及其中一个区别。
Neowizard,2016年

1

问题的一部分是,您可以根据其结构不同大声读出它。可惜的是,它不像红宝石的|一样漂亮或没有那么综合。


你怎么说|?和管子一样吗?
dtc

很难找到任何指导,但是_why使用“取用”,即People.each {| person |。puts person.name}变成“ With People带每个人并打印姓名”
Adam Lassek

1

在Ruby中,相同的sybmol称为“ hashrocket”,而且我听说C#程序员也使用该术语(即使这样做是错误的)。


0

我的两分钱:

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

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

我喜欢这个,因为它让我想起了lamdba表情来自哪里

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

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


0

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

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

s,其中s.Age大于12且s.Age小于20

'result = x => x * 2'

x其中x乘以2

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

c,其中c.city等同于“伦敦”

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

n其中n是一个空字符串

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.