我怎么发音“=>”用于.Net中的lambda表达式

时间:2008-11-07 23:44:58

标签: c# .net lambda conventions

我很少遇到任何其他程序员!

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

那我怎么说或读“=>”如: -

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

或者甚至有同意的说法吗?

16 个答案:

答案 0 :(得分:147)

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

在您的示例中,p =&gt; p.Age&gt; 16读作“P,这样p.Age大于16。”

事实上,我在官方的linq预发布论坛上提出了这个问题,Anders Hejlsberg回应说

  

我经常阅读=&gt;运算符为“变为”或“为其”。例如,
  Func f = x =&gt; x * 2;
  功能测试= c =&gt; c.City ==“伦敦”;
  读为“x变为x * 2”和“c为c.City等于伦敦”

至于'去' - 这对我来说永远不会有意义。 'p'不会去任何地方。

在通过电话向某人阅读代码的情况下,只要他们是C#程序员,我就会使用“lambda”这个词 - 也就是“p lambda p dot age”大于十六岁。“

在评论中,Steve Jessop在转换的情况下提到了“map to” - 所以以Anders为例:

x => x * 2;

会读

  

x映射到x次2。

对于这种情况,这似乎更接近于代码的实际意图。

答案 1 :(得分:56)

来自MSDN

  

所有lambda表达式都使用lambda   operator =&gt;,读作“去   于”。

答案 2 :(得分:18)

Reading Code Over the Telephone

来自Eric Lippert:

我个人会说c =&gt; c + 1为“看得见加一”。我听到的一些变化:

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

对于谓词,(客户c)=&gt; c.Age&gt; 21:“客户看到这样看点时代大于二十一”

答案 3 :(得分:15)

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

“p王龄大于16”

答案 4 :(得分:7)

我见过有人说,“箭头。”

答案 5 :(得分:7)

我使用“转到”因为LINQ书告诉我:)

答案 6 :(得分:5)

“映射到”怎么样?它既简洁又可以说在技术上更准确(即没有像“转到”或“变成”那样的状态变化的建议,没有一个集合与其特征函数的混淆,如“如此”或“为哪个”)而不是其他选择。虽然如果已经有一个标准,因为MSDN页面似乎暗示,也许你应该去那(至少对于C#代码)。

答案 7 :(得分:3)

“地图到”是我的首选发音。从数学上讲,函数将其参数“映射”到它的返回值(甚至可以将函数称为“映射”),因此在编程中使用这个术语是有意义的,特别是作为函数式编程(特别是lambda演算)非常接近数学。它也比“变成”,“变为”等等更中立,因为它并不表示状态的变化,正如上下文提到的那样。

答案 8 :(得分:2)

除了获取前面的作用域(表达式代码可用lambda表达式的正常代码行的范围内的所有变量和常量),lambda表达式基本上是语法糖。内联函数。

生产运算符左侧的值列表(“=&gt;”)提供用于调用此函数的堆栈帧的结构和内容。您可以说值列表同时提供参数声明和传递的参数;在更传统的代码中,这些代码确定了用于调用函数的堆栈帧的结构和内容。

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

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

然而,lambda表达式并不是Linq的唯一省份,除此之外,应该使用更“一般”的形式。


但为什么要“去”?

因为“填充以下代码的堆栈帧”太久了,所以不能继续说。我想你可以说“是/被传递给了”。

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

答案 9 :(得分:2)

我没有想太多,但我只是简单地说“to”。它简洁明了,暗示变量是传递给表达式。我想它可能与数字2(“两个”)相混淆,但我倾向于在说话时发音“to”更像“ta”。没人(至少知道lambda)曾告诉我他们认为它含糊不清......

// "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"

答案 10 :(得分:2)

我的简短回答:“c'lambda-of'e”。虽然我坚持“'lambda'c'功能'e”,但我认为lambda-of是普世的妥协。分析如下。

如果只是为了奇怪的答案,这是一个很好的问题。大多数翻译都有其他含义,而不是lambda表达,导致异国情调的解释。作为一个古老的lambda表达式黑客,我只是忽略了.NET符号并将其重写为我的头脑中的lambda,同时希望他们为此做了其他任何事情。


通过电话叙述代码,您希望某人能够按顺序编写代码。当然,这是一个问题,但是lambda-arrow或其他东西可能是你能得到的最好的,或者也许是lambda-in,但lambda-of是最准确的。

问题在于中缀的使用以及如何命名整个事物以及左右部分的作用,以及在中缀位置使用的内容。

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


我不会使用“这样”,因为这意味着右手边是左手边应该满足的谓词。这与左手边作为功能参数被抽象的右手边有很大的不同。 (关于“所有lambda表达式”的MSDN声明只是冒犯性的,也是不准确的。)

虽然它可能会尽可能地接近,但仍有一些关于“进入”的事情。 “Goes to”意味着转换,但没有一个变量c转到c中的表达式。对函数的抽象有点难以捉摸。我可以习惯这个,但我仍然渴望能够强调变量抽象的东西。

由于左手边在目前使用的情况下始终是一个简单的标识符[但是等待以后可能会混淆的扩展],我认为对于“c =&gt;表达式”我会读到“c'lambda -function'expression''或甚至“c'arg''function'表达式”。在最后一种情况下,我可以说“b'arg'c'arg''function'表达式”之类的东西。

最好更清楚地说明正在引入lambda表达式并说出类似“'arg'b'arg'c'function'表达式”的内容。

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

我仍然担心“(b,c)=&gt;表达式”和其他可能产生的变体(如果还没有)。也许“'args'b,c'功能'表达”。


在完成所有这些思考之后,我注意到我正在将“c =&gt; e”翻译为“'lambda'c'函数'e”并注意到映射到精确形式将被上下文理解:λc(e),c =&gt; e,f 其中 f(c)= e等

我希望“转到”的解释会占上风,因为这是占绝大多数人第一次看到lambda表达式的地方。这真遗憾。一个好的妥协可能是“c' lambda-of 'e”

答案 11 :(得分:2)

如果你想象一个lambda表达式作为它的匿名方法,那么“去”就足够了。

(n => n == String.Empty)

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

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

很抱歉。

老实说,我不喜欢在脑海中使用“去”,但我看到其他人说它看起来很奇怪,而且我以为我会清楚这一点。

答案 12 :(得分:1)

部分问题在于,您可以根据其结构的不同而大声朗读。遗憾的是它并不像ruby的那样漂亮或整合。

答案 13 :(得分:1)

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

答案 14 :(得分: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是一个空字符串

答案 15 :(得分:-1)

我的两分钱:

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

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

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

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

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