问题标签 [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.
matlab - 从主函数中清除局部函数中的持久变量
我有一个代码,它由一个包含多个函数的文件组成,其中一些函数使用persistent
变量。为了使其正常工作,持久变量必须为空。
有记录的方法可以清除多功能文件中的持久变量,例如:
不幸的是,我不能保证用户persistent
在调用函数之前记得清除变量,所以我正在探索在代码开头执行清除操作的方法。为了说明问题,请考虑以下示例:
首次运行时,我们得到:
我希望此时再次运行该函数,任何非 0 输入都会导致val
变量被清除,但可惜 - 情况并非如此。设置后val
,除非我们在外部使用顶部代码段中显示的替代方案之一,或修改.m
文件,否则它保持设置。
我的问题:是否可以从主函数的主体中清除子函数中的持久变量,如果可以,如何?
换句话说,我正在寻找一些可以在clearPersistent
调用子函数之前放入的代码,以便输出始终如一:
附言
这是一个相关的过去问题(不涉及此特定用例):List/view/clear persistent variables in Matlab。
我知道重写代码以根本不使用
persistent
变量的可能性(例如,通过传递数据、使用appdata
、向所有子函数添加'clear'
标志等)。请注意,编辑函数的源代码并保存会隐式清除它(以及所有持久变量)。
我知道文档指出“该
clear
函数不会清除本地或嵌套函数中的持久变量。
问题的其他背景:
实际代码结构如下:
正如评论中提到的,有几个原因使某些变量保持不变:
- 松散耦合/SoC:目标函数不需要知道子函数是如何工作的。
- 封装:它是一个实现细节。持久变量不需要存在于使用它们的函数范围之外(即没有其他人需要它们)。
- 性能:持久变量包含计算成本相当高的矩阵,但每次调用主函数时,此操作只需发生一次。
使用持久变量的一个(副作用?)效果是使整个代码有状态(有两种状态:在昂贵的计算之前和之后)。最初的问题源于这样一个事实,即在调用 main 函数之间未正确重置状态,导致运行依赖于使用先前(因此无效)配置创建的状态。
可以通过计算 main 函数中的一次性值(目前只解析用户提供的配置,调用求解器,最后存储/显示输出),然后将它们与用户配置一起传递到目标中来避免有状态函数,然后将它们传递给子函数。这种方法解决了状态清除问题,但损害了封装性并增加了耦合,进而可能损害可维护性。
不幸的是,目标函数没有表示'init'
etc.的标志,所以我们不知道它是第一次调用还是第 n次调用,而我们自己没有跟踪这一点(AKA state)。
理想的解决方案将具有几个属性:
- 计算一次昂贵的数量。
- 无国籍。
- 不传递不相关的数据(即“需要知道基础”;各个功能工作区只包含他们需要的数据)。
c# - 为什么我必须使用动态输入参数对强类型函数进行类型转换?
我有一个转换器方法:
我必须明确地将结果转换为 MyPoco,否则 poco 也会成为动态变量。
但是,如果我内联 Convert 方法;
我不需要将 ConvertItem 转换为 MyPoco。这种行为有原因吗?编译器应该很容易知道 Convert 返回类型是 MyPoco,对吧?
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:
- I don't understand why would you want to ensure that?
- Is there any other reason or benefits to declare it static? (performance maybe?)
The example code given in the article is:
c# - 我可以告诉外部函数从其本地函数内部返回吗?
我有一个 IEnumerator,我需要在函数内部进行一些检查,如果其中一些检查失败,我需要进行一些维护,然后退出 IEnumerator。但是当我写入yield break
内部函数时,它认为我正在尝试从该内部函数返回。
我想我可以yield break
在内部函数调用之后写,但我想保持干燥。
c# - .net 核心开关表达式以错误的值递增
我正在玩我的 intcode 计算机实现(从代码 2019 的出现开始),发现当我实现开关(以选择要执行的操作)时,它采用了错误的值。
下面的代码演示了这一点。
InstructionPointer
有 的值2
,opcode
有 的值6
意味着OpcodeJumpIfFalse
将被使用。函数Jif()
被调用得很好,它返回一个值,在我的例子中它返回0
. Jif()
还修改了 的值InstructionPointer
,将其值更改为9
。会InstructionPointer
增加0
(返回值Jif()
),我希望它的值是9
,但它的值会回到原来的2
。
显示相同行为的最小示例:
我确实注意到 Resharper(在最小的例子中)告诉我分配在A()
.
我的问题是,为什么会发生这种情况?j
是切换前“捕获”的值吗?这是预期的行为吗?
现在,我已将代码更改为使用临时变量,这解决了问题,但我仍然想知道这里发生了什么。
c#-7.0 - 在 C# 中调用函数时出错,因为参数中使用了变量
我是 c# 新手,但我正在尝试创建一个基本程序,该程序可以使用添加数字的函数(这只是练习,我知道它效率低下。
但是,当我尝试它时,它说“无法在此范围内声明名为 'num1' 的本地参数,因为该名称在封闭的本地范围中用于定义本地或参数”。我认为这是因为我在调用函数时声明了变量,但我不知道如何修复它。
谢谢你的帮助!
编辑:为了清楚起见,函数后面的数字是我想在函数中添加的数字
c# - 以闭包作为事件处理程序的 C# 本地函数:为什么它会这样工作?
我最近遇到了一个我不理解的行为。我有一个本地函数,它从封闭方法中捕获变量/参数。在这种情况下,在我看来,每次调用封闭方法时,都会创建本地函数的新“实例”。在下面的代码中很容易看到这种行为。
你能解释一下为什么本地函数会这样吗?
VS 或 Resharper 都没有给我任何警告这样做,但这很容易错过并且可能导致难以找到错误。
上面代码的一些替代方案是:
如果你在局部函数内部创建一个局部变量并将参数分配给它,它的行为仍然像一个闭包。
如果您创建一个字段并在封闭方法中为其分配参数,并在本地函数中访问该字段,它的行为就不会像一个闭包。
c# - 局部函数的总结注释和参考不起作用
如您所知,在 C# 7.0 中添加了一些新功能,其中之一是本地函数。我查看了一些使用局部函数的示例和用例,发现使用它们的两个原因:
1) 隐藏函数或方法。原因是:如果该函数不是本地函数,它可能会被其他成员意外直接使用
2) 使用“父”函数的变量
在重构代码的调试过程中,我在 Visual Studio 中找不到对本地函数的引用。有对私有函数的引用:
当我调试或重构代码时,它会有所帮助。在本地函数中我找不到它们:
那么,第一个问题是为什么本地函数不显示摘要注释和引用?
一些程序员喜欢使用本地函数,但有些人不喜欢。这是一个示例(来自C# 7.0 中的新增功能 | .NET 博客):
在这种情况下,使用本地函数的原因是:
如果Iterator
是旁边的私有方法Filter
,其他成员可以直接使用它(无需检查参数)。此外,它需要采用所有相同的参数,Filter
而不是让它们只在范围内
第二个问题是为什么要使用局部函数?在这种情况下,我们可以删除本地方法,因为它只使用了一次。如果我们担心代码大小或代码责任,我们可以使用region:
python - permutations-为什么我们需要从本地函数返回列表的副本?
我正在编写如下的置换函数,我感到困惑的是,如果我们返回“res.append(nums[:])”,它可以完美运行,但是如果我们只返回“res.append(nums)”,它'只会返回原始的 nums 值,而不是在我操作后存储新的 nums ......但不确定它背后的理论,有人可以解释一下吗?谢谢!
c# - 了解循环内变量的局部函数捕获
我注意到以下内容。这个 C# 代码:
产生 4, 4, 4, 4。另一方面,这段代码:
产生 0、1、2、3。
我不确定我明白为什么。我读过一些关于“捕获”的文章,但我不确定这是否与这里发生的事情有关。有人可以告诉我为什么这两种实现的行为不同吗?