相关疑难解决方法(0)

C#在foreach中重用变量是否有原因?

在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循环中定义的变量不能在循环外使用: …

c# foreach lambda scope anonymous-methods

1631
推荐指数
4
解决办法
10万
查看次数

'闭包'和'lambda'有什么区别?

有人能解释一下吗 我理解它们背后的基本概念,但我经常看到它们互换使用,我感到困惑.

现在我们在这里,它们与常规功能有什么不同?

lambda closures functional-programming function

774
推荐指数
12
解决办法
12万
查看次数

什么是词汇范围?

有人可以给我一个关于词汇范围的简要介绍吗?

javascript scoping lexical-scope

645
推荐指数
14
解决办法
16万
查看次数

如果只有功能B需要功能A应该在B内定义A?

简单的例子.两种方法,一种叫另一种方法:

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)

或者我应该避免这样做?

python coding-style

140
推荐指数
8
解决办法
24万
查看次数

与语言X闭包相比,Python中的闭包有哪些限制?

X是任何支持某种闭包风格的编程语言(C#,Javascript,Lisp,Perl,Ruby,Scheme等).

Python中的Closures中提到了一些限制(与Ruby的闭包相比),但文章很旧,现代Python中不再存在许多限制.

查看具体限制的代码示例会很棒.

相关问题:

python closures

47
推荐指数
4
解决办法
7942
查看次数

什么时候关闭?

我看过关闭的样本 - 什么是'关闭'?

任何人都可以提供何时使用闭包的简单示例?

具体来说,闭包有意义吗?

让我们假设语言没有关闭支持,如何才能实现类似的东西呢?

不要冒犯任何人,请用c#,python,javascript,ruby等语言发布代码示例.
很抱歉,我还不懂函数式语言.

c# closures functional-programming

37
推荐指数
4
解决办法
8697
查看次数

这种自我调用匿名函数变体背后的原因

在github上查看代码时,我发现了以下内容:

(function() {

}).call(this);
Run Code Online (Sandbox Code Playgroud)

这显然是一个自我调用的匿名函数.但为什么这样写呢?我习惯于看到规范的变体(function() {})().

使用.call(this)自动调用匿名函数有什么特别的优势吗?


编辑:看起来某些commonjs环境this在模块的顶层设置为非全局值.哪些,以及它们this可能想要保留的内容是什么?

javascript module anonymous-function commonjs coffeescript

25
推荐指数
2
解决办法
6089
查看次数

关闭因为它能做什么或因为它做什么

好吧,这是一个迂腐的问题,但我想确保我正确理解这个定义.使用封闭的绰号来形容匿名函数可以解除在局部范围内的变量(无论他们实际上做还是不做)或者只有当他们解除局部范围内的变量?

换句话说,如果一个匿名函数能够在其局部范围内提升变量(因为语言提供了这种能力)但是没有,它仍然被认为是一个闭包吗?

我的理解是,只有当局部变量被解除时,它才是闭包.但是一个没有的匿名函数(尽管它可以)不是一个闭包.因此,并非所有匿名函数都是闭包,但所有闭包都是匿名函数.

再次,抱怨迂腐,但这些东西啃着我.:)

closures functional-programming

15
推荐指数
2
解决办法
4809
查看次数

关于Scala关闭的问题(来自"Scala编程")

我不明白为什么作者说"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)

closures scala

8
推荐指数
1
解决办法
2713
查看次数

有人能用简单的术语解释C#中的"访问修改后的闭包"吗?

可能重复:
什么是'关闭'?
访问修改后的闭包
访问修改后的闭包(2)

Resharper抱怨下面这段代码:

foreach (string data in _dataList)
    DoStuff (() => field);
Run Code Online (Sandbox Code Playgroud)

什么是关闭?我为什么要关心?

我已经读过关于数学和函数式编程的闭包,我在这里不知所措.我的大脑太沉重了.

简单来说,这里发生了什么?

c# closures

8
推荐指数
1
解决办法
6774
查看次数