我很少遇到其他程序员!
当我第一次看到这个标记时,我的想法是“暗示”,因为这就是它在数学证明中的理解,但这显然不是它的意义。
那么我该如何说或读“=>”,如下所示:-
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)
还是有一种约定俗成的说法?
我很少遇到其他程序员!
当我第一次看到这个标记时,我的想法是“暗示”,因为这就是它在数学证明中的理解,但这显然不是它的意义。
那么我该如何说或读“=>”,如下所示:-
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)
还是有一种约定俗成的说法?
在阅读该运算符时,我通常会说“这样”。
在您的示例中,p => p.Age > 16 读作“P,因此 p.Age 大于 16”。
事实上,我在官方 linq 预发布论坛上问过这个问题,Anders Hejlsberg 回答说
我通常将 => 运算符解读为“成为”或“为哪个”。例如,
函数 f = x => x * 2;
功能测试 = c => c.City == "伦敦";
读作“x变成x * 2”和“c.City等于伦敦的c”
至于“去”——这对我来说从来没有意义。'p' 不会去任何地方。
在通过电话向某人阅读代码的情况下,只要他们是 C# 程序员,我就会使用“lambda”这个词——即“p lambda p dot age greater-than十六。”
在评论中,Steve Jessop 在转换的情况下提到了“映射到”——所以以 Anders 为例:
x => x * 2;
会读
x 映射到 x 乘以 2。
对于这种情况,这似乎比“成为”更接近代码的实际意图。
来自MSDN:
所有 lambda 表达式都使用 lambda 运算符 =>,读作“goes to”。
来自埃里克·利珀特:
我个人会说 c=>c+1 为“见多识广”。我听到的一些变化:
对于投影,(Customer c)=>c.Name: "customer see become see dot name"
对于谓词,(Customer c)=>c.Age > 21: "customer see such that see dot age is greater than 21"
我一直称它为“wang operator”:-)
“p wang 年龄 p 大于 16”
我见过人们说,“箭”。
我使用“goes to”是因为一本 LINQ 书告诉我:)
“映射到”怎么样?它比其他选择。虽然如果 MSDN 页面似乎暗示已经有一个标准,也许您应该使用它(至少对于 C# 代码)。
“映射到”是我喜欢的发音。从数学上讲,函数将其参数“映射”到其返回值(甚至可以将函数称为“映射”),因此在编程中使用这个术语对我来说是有意义的,特别是作为函数式编程(尤其是 lambda 演算)非常接近数学。它也比“成为”、“去”等更中立,因为它并不暗示状态的改变,正如 contextfree 提到的那样。
除了获取前面的作用域(在出现 lambda 表达式的地方,正常代码行范围内的所有变量和常量都可用于表达式的代码)之外,lambda 表达式本质上是内联函数的语法糖。
产生式运算符 ("=>") 左侧的值列表提供了用于调用此函数的堆栈帧的结构和内容。你可以说值列表贡献了参数声明和传递的参数。在更传统的代码中,这些决定了用于调用函数的堆栈帧的结构和内容。
结果,值“转到”表达式代码。你更愿意说“定义堆栈框架”还是“去”?:)
在用作过滤条件的布尔表达式的狭义应用中(该问题的其他答案广泛考虑的 lambda 表达式的主要用途)跳过该方法以支持代码的意图是非常合理的,这会导致“为此”同样简洁,并更多地说明了代码的含义。
但是,lambda 表达式并不是 Linq 的唯一领域,在此上下文之外,应该使用更一般的形式“goes to”。
因为“填充以下代码的堆栈帧”太长了,不能一直说。我想你可以说“是/被传递给”。
显式传递的参数和捕获的变量之间的一个关键区别(如果我没记错的话——如果我错了,请纠正我)是前者通过引用传递,而后者通过值传递。
我没有想太多,但我只是简洁地说“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"
我的简短回答:“c 'lambda-of' e”。尽管我坚持使用“'lambda' c 'function' e”,但我认为 lambda-of 是普遍的妥协。分析如下。
如果只是为了奇怪的答案,这是一个很好的问题。大多数翻译具有除 lambda 表达式之外的其他含义,导致了奇异的解释。作为一个老的 lambda 表达式黑客,我只是忽略了 .NET 符号,并在我的脑海中将其重写为 lambda,同时希望他们为此做了几乎任何其他事情。
对于通过电话叙述代码,您希望有人能够按顺序写下代码。当然,这是一个问题,但 lambda-arrow 或其他东西可能是你能得到的最好的,或者可能是 lambda-in,但 lambda-of 是最准确的。
问题是中缀用法以及如何命名整个事物以及左右部分的作用与在中缀位置说话时起作用的东西。
这可能是一个过度约束的问题!
我不会使用“这样”,因为这意味着右侧是左侧应该满足的谓词。这与谈论将左侧抽象为功能参数的右侧非常不同。(关于“所有 lambda 表达式”的 MSDN 声明简直令人反感且不准确。)
尽管它可能与我们所能得到的一样接近,但对“去”的一些东西感到愤怒。“Goes to”意味着转换,但并不完全有某个变量 c 可以用于 c 中的表达式。对函数的抽象有点难以捉摸。我可以习惯这一点,但我仍然渴望强调变量抽象的东西。
由于在目前使用的情况下,左侧始终是一个简单的标识符[但请等待稍后可能会混淆这一点的扩展],我认为对于“c => 表达式”,我会阅读“c 'lambda-function' 表达式"' 甚至是 "c 'arg' 'function' 表达式"。在最后一种情况下,我可以说诸如“b 'arg' c 'arg' 'function' expression”之类的东西。
最好更清楚地说明正在引入 lambda 表达式并说出类似“'arg' b 'arg' c 'function' expression”之类的内容。
弄清楚如何将所有这些翻译成其他语言是学生的练习 [;<)。
我仍然担心“(b,c)=>表达式”和其他可能出现的变体,如果它们还没有出现的话。也许是“'args' b, c 'function' 表达式”。
在所有这些沉思之后,我注意到我开始将“c => e”翻译为“'lambda' c 'function' e”,并注意到要通过上下文来理解精确形式的映射:λc(e ), c => e, f其中f(c) = e 等。
我希望“直接”的解释会占上风,因为这是占主导地位的大多数人第一次看到 lambda 表达式的地方。这真遗憾。一个好的折衷方案可能是“c ' lambda-of ' e”
如果您将 lambda 表达式想象为它的匿名方法,那么“goes to”就足够有意义了。
(n => n == String.Empty)
n “转到”表达式 n == String.Empty。
它转到匿名方法,因此您不必转到代码中的方法!
对此感到抱歉。
老实说,我不喜欢在脑海中使用“goes to”,但我看到其他人说这似乎很奇怪,我想我会澄清这一点。
部分问题在于,您可以根据其结构不同大声朗读。可惜它不像 ruby 的 |'s 那样漂亮或集成。
在 Ruby 中,同样的 sybmol 称为“hashrocket”,我听说 C# 程序员也使用这个术语(尽管这样做是错误的)。
我的两分钱:
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; };
=> 只是一个快捷方式,因此您不必使用委托关键字并包含类型信息,因为它可以由编译器推断。
我的 => 术语应用于显示结果的示例
'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 是一个空字符串