在C#中使用lambda表达式或匿名方法时,我们必须警惕对修改后的闭包陷阱的访问.例如:
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
Run Code Online (Sandbox Code Playgroud)
由于修改后的闭包,上面的代码将导致Where查询中的所有子句都基于最终值s.
正如这里所解释的那样,这是因为上面循环中s声明的变量foreach在编译器中被翻译成这样:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
Run Code Online (Sandbox Code Playgroud)
而不是像这样:
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
Run Code Online (Sandbox Code Playgroud)
正如这里所指出的,在循环外声明变量没有性能优势,在正常情况下,我能想到这样做的唯一原因是你计划在循环范围之外使用变量:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
Run Code Online (Sandbox Code Playgroud)
但是,foreach循环中定义的变量不能在循环外使用: …
有人能解释一下吗 我理解它们背后的基本概念,但我经常看到它们互换使用,我感到困惑.
现在我们在这里,它们与常规功能有什么不同?
简单的例子.两种方法,一种叫另一种方法:
def method_a(arg):
some_data = method_b(arg)
def method_b(arg):
return some_data
Run Code Online (Sandbox Code Playgroud)
在Python中,我们可以def在另一个内部声明def.因此,如果method_b需要并且仅从中调用method_a,我应该method_b在内部声明method_a吗?像这样 :
def method_a(arg):
def method_b(arg):
return some_data
some_data = method_b
Run Code Online (Sandbox Code Playgroud)
或者我应该避免这样做?
我看过关闭的样本 - 什么是'关闭'?
任何人都可以提供何时使用闭包的简单示例?
具体来说,闭包有意义吗?
让我们假设语言没有关闭支持,如何才能实现类似的东西呢?
不要冒犯任何人,请用c#,python,javascript,ruby等语言发布代码示例.
很抱歉,我还不懂函数式语言.
在github上查看代码时,我发现了以下内容:
(function() {
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这显然是一个自我调用的匿名函数.但为什么这样写呢?我习惯于看到规范的变体(function() {})().
使用.call(this)自动调用匿名函数有什么特别的优势吗?
编辑:看起来某些commonjs环境this在模块的顶层设置为非全局值.哪些,以及它们this可能想要保留的内容是什么?
好吧,这是一个迂腐的问题,但我想确保我正确理解这个定义.使用封闭的绰号来形容匿名函数可以解除在局部范围内的变量(无论他们实际上做还是不做)或者只有当他们做解除局部范围内的变量?
换句话说,如果一个匿名函数能够在其局部范围内提升变量(因为语言提供了这种能力)但是没有,它仍然被认为是一个闭包吗?
我的理解是,只有当局部变量被解除时,它才是闭包.但是一个没有的匿名函数(尽管它可以)不是一个闭包.因此,并非所有匿名函数都是闭包,但所有闭包都是匿名函数.
再次,抱怨迂腐,但这些东西啃着我.:)
我不明白为什么作者说"Scala编程"的代码清单9.1使用了闭包.在第9章中,他们展示了如何将代码重构为更复杂的形式,从这个原始代码:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesEnding(query: String) =
for (file <- filesHere; if file.getName.endsWith(query))
yield file
def filesContaining(query: String) =
for (file <- filesHere; if file.getName.contains(query))
yield file
def filesRegex(query: String) =
for (file <- filesHere; if file.getName.matches(query))
yield file
}
Run Code Online (Sandbox Code Playgroud)
到第二个版本:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesMatching(query: String,
matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query))
yield file
}
def filesEnding(query: String) …Run Code Online (Sandbox Code Playgroud) 可能重复:
什么是'关闭'?
访问修改后的闭包
访问修改后的闭包(2)
Resharper抱怨下面这段代码:
foreach (string data in _dataList)
DoStuff (() => field);
Run Code Online (Sandbox Code Playgroud)
什么是关闭?我为什么要关心?
我已经读过关于数学和函数式编程的闭包,我在这里不知所措.我的大脑太沉重了.
简单来说,这里发生了什么?
closures ×6
c# ×3
javascript ×2
lambda ×2
python ×2
coding-style ×1
coffeescript ×1
commonjs ×1
foreach ×1
function ×1
module ×1
scala ×1
scope ×1
scoping ×1