问题标签 [local-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
393 浏览

matlab - 从主函数中清除局部函数中的持久变量

我有一个代码,它由一个包含多个函数的文件组成,其中一些函数使用persistent变量。为了使其正常工作,持久变量必须为空。

有记录的方法可以清除多功能文件中的持久变量,例如:

不幸的是,我不能保证用户persistent在调用函数之前记得清除变量,所以我正在探索在代码开头执行清除操作的方法。为了说明问题,请考虑以下示例:

首次运行时,我们得到:

我希望此时再次运行该函数,任何非 0 输入都会导致val变量被清除,但可惜 - 情况并非如此。设置后val,除非我们在外部使用顶部代码段中显示的替代方案之一,或修改.m文件,否则它保持设置。

我的问题:是否可以从主函数的主体中清除子函数中的持久变量,如果可以,如何?

换句话说,我正在寻找一些可以在clearPersistent调用子函数之前放入的代码,以便输出始终如一:


附言

  1. 这是一个相关的过去问题(不涉及此特定用例):List/view/clear persistent variables in Matlab

  2. 我知道重写代码以根本不使用persistent变量的可能性(例如,通过传递数据、使用appdata、向所有子函数添加'clear'标志等)。

  3. 请注意,编辑函数的源代码并保存会隐式清除它(以及所有持久变量)。

  4. 我知道文档指出“clear函数不会清除本地或嵌套函数中的持久变量。


问题的其他背景:

实际代码结构如下:

正如评论中提到的,有几个原因使某些变量保持不变:

  1. 松散耦合/SoC:目标函数不需要知道子函数是如何工作的。
  2. 封装:它是一个实现细节。持久变量不需要存在于使用它们的函数范围之外(即没有其他人需要它们)。
  3. 性能:持久变量包含计算成本相当高的矩阵,但每次调用主函数时,此操作只需发生一次。

使用持久变量的一个(副作用?)效果是使整个代码有状态(有两种状态:在昂贵的计算之前之后)。最初的问题源于这样一个事实,即在调用 main 函数之间未正确重置状态,导致运行依赖于使用先前(因此无效)配置创建的状态。

可以通过计算 main 函数中的一次性值(目前只解析用户提供的配置,调用求解器,最后存储/显示输出),然后将它们与用户配置一起传递到目标中来避免有状态函数,然后将它们传递给子函数。这种方法解决了状态清除问题,但损害了封装性并增加了耦合,进而可能损害可维护性。

不幸的是,目标函数没有表示'init'etc.的标志,所以我们不知道它是第一次调用还是第 n调用,而我们自己没有跟踪这一点(AKA state)。

理想的解决方案将具有几个属性:

  1. 计算一次昂贵的数量。
  2. 无国籍。
  3. 不传递不相关的数据(即“需要知道基础”;各个功能工作区只包含他们需要的数据)。
0 投票
1 回答
196 浏览

c# - 为什么我必须使用动态输入参数对强类型函数进行类型转换?

我有一个转换器方法:

我必须明确地将结果转换为 MyPoco,否则 poco 也会成为动态变量。

但是,如果我内联 Convert 方法;

我不需要将 ConvertItem 转换为 MyPoco。这种行为有原因吗?编译器应该很容易知道 Convert 返回类型是 MyPoco,对吧?

0 投票
4 回答
3197 浏览

c# - Why declare a local function static in C# 8.0

In C# 8.0, Static Local Functions are announced

Can anyone help enlighten me as to why you would want to declare a local function as static?

The reason given in in the article:

to ensure that local function doesn't capture (reference) any variables from the enclosing scope

But:

  1. I don't understand why would you want to ensure that?
  2. Is there any other reason or benefits to declare it static? (performance maybe?)

The example code given in the article is:

0 投票
1 回答
249 浏览

c# - 我可以告诉外部函数从其本地函数内部返回吗?

我有一个 IEnumerator,我需要在函数内部进行一些检查,如果其中一些检查失败,我需要进行一些维护,然后退出 IEnumerator。但是当我写入yield break内部函数时,它认为我正在尝试从该内部函数返回。

我想我可以yield break在内部函数调用之后写,但我想保持干燥。

0 投票
1 回答
88 浏览

c# - .net 核心开关表达式以错误的值递增

我正在玩我的 intcode 计算机实现(从代码 2019 的出现开始),发现当我实现开关(以选择要执行的操作)时,它采用了错误的值。

下面的代码演示了这一点。 InstructionPointer有 的值2opcode有 的值6意味着OpcodeJumpIfFalse将被使用。函数Jif()被调用得很好,它返回一个值,在我的例子中它返回0. Jif()还修改了 的值InstructionPointer,将其值更改为9。会InstructionPointer增加0(返回值Jif()),我希望它的值是9,但它的值会回到原来的2

显示相同行为的最小示例:

我确实注意到 Resharper(在最小的例子中)告诉我分配在A().

我的问题是,为什么会发生这种情况?j是切换前“捕获”的值吗?这是预期的行为吗?

现在,我已将代码更改为使用临时变量,这解决了问题,但我仍然想知道这里发生了什么。

0 投票
3 回答
201 浏览

c#-7.0 - 在 C# 中调用函数时出错,因为参数中使用了变量

我是 c# 新手,但我正在尝试创建一个基本程序,该程序可以使用添加数字的函数(这只是练习,我知道它效率低下。

但是,当我尝试它时,它说“无法在此范围内声明名为 'num1' 的本地参数,因为该名称在封闭的本地范围中用于定义本地或参数”。我认为这是因为我在调用函数时声明了变量,但我不知道如何修复它。

谢谢你的帮助!

编辑:为了清楚起见,函数后面的数字是我想在函数中添加的数字

0 投票
2 回答
856 浏览

c# - 以闭包作为事件处理程序的 C# 本地函数:为什么它会这样工作?

我最近遇到了一个我不理解的行为。我有一个本地函数,它从封闭方法中捕获变量/参数。在这种情况下,在我看来,每次调用封闭方法时,都会创建本地函数的新“实例”。在下面的代码中很容易看到这种行为。

你能解释一下为什么本地函数会这样吗?

VS 或 Resharper 都没有给我任何警告这样做,但这很容易错过并且可能导致难以找到错误。

上面代码的一些替代方案是:

  • 如果你在局部函数内部创建一个局部变量并将参数分配给它,它的行为仍然像一个闭包。

  • 如果您创建一个字段并在封闭方法中为其分配参数,并在本地函数中访问该字段,它的行为就不会像一个闭包。

0 投票
1 回答
422 浏览

c# - 局部函数的总结注释和参考不起作用

如您所知,在 C# 7.0 中添加了一些新功能,其中之一是本地函数。我查看了一些使用局部函数的示例和用例,发现使用它们的两个原因:

1) 隐藏函数或方法。原因是:如果该函数不是本地函数,它可能会被其他成员意外直接使用

2) 使用“父”函数的变量

在重构代码的调试过程中,我在 Visual Studio 中找不到对本地函数的引用。有对私有函数的引用:

私有函数

当我调试或重构代码时,它会有所帮助。在本地函数中我找不到它们:

局部函数

那么,第一个问题是为什么本地函数不显示摘要注释和引用?

一些程序员喜欢使用本地函数,但有些人不喜欢。这是一个示例(来自C# 7.0 中的新增功能 | .NET 博客):

在这种情况下,使用本地函数的原因是:

如果Iterator是旁边的私有方法Filter,其他成员可以直接使用它(无需检查参数)。此外,它需要采用所有相同的参数,Filter而不是让它们只在范围内

第二个问题是为什么要使用局部函数?在这种情况下,我们可以删除本地方法,因为它只使用了一次。如果我们担心代码大小或代码责任,我们可以使用region

0 投票
2 回答
67 浏览

python - permutations-为什么我们需要从本地函数返回列表的副本?

我正在编写如下的置换函数,我感到困惑的是,如果我们返回“res.append(nums[:])”,它可以完美运行,但是如果我们只返回“res.append(nums)”,它'只会返回原始的 nums 值,而不是在我操作后存储新的 nums ......但不确定它背后的理论,有人可以解释一下吗?谢谢!


https://leetcode.com/problems/permutations/

0 投票
1 回答
40 浏览

c# - 了解循环内变量的局部函数捕获

我注意到以下内容。这个 C# 代码:

产生 4, 4, 4, 4。另一方面,这段代码:

产生 0、1、2、3。

我不确定我明白为什么。我读过一些关于“捕获”的文章,但我不确定这是否与这里发生的事情有关。有人可以告诉我为什么这两种实现的行为不同吗?