问题标签 [side-effects]

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 投票
4 回答
302 浏览

c++ - 如何在 C++11 中的函数调用后将对象声明为无效?

在 C++11 中是否有在函数返回后将函数的输入参数声明为无效?

举个简单的例子,假设我有一个矩形对象,其左下角坐标和右上角坐标。如果我通过对函数的非常量引用传递此矩形对象,则该函数可以自由地对矩形内存产生副作用,因为它认为合适。如果该函数需要缩放它而不是复制到新内存只是想在原地工作怎么办,我们如何在 C++11 中声明函数返回后,传入的矩形的内容不再有效,因为它们可能已经被调用的函数修改了?

我不想修改矩形类,而是在函数调用的声明中采用某种方式来指示通过引用传入的内存在从函数返回时应被视为无效,并且如果调用者则让编译器给出错误尝试在函数调用返回之后使用它。有没有办法在 C++11 中做到这一点?

0 投票
4 回答
597 浏览

regex - 为什么 Perl 的 m//g 运算符有时会导致将 NULL 引入文本?

我们最近在我们的一个 Perl 脚本中遇到了一些奇怪的结果,其中 NULL 字符(Pe​​rl 中的 \0)被引入到某些文本中。我们最终将其追溯到 Perl m// 匹配运算符上偶然使用的 //g 运算符。在这发生之前,我什至不知道您可以将 //g 与 m// 运算符一起使用,因为我只将它与 s/// 运算符一起使用过。

无论如何,即使我们已经通过删除错误的//g 修复了这个错误,我很想知道为什么这个小脚本会在文本中引入一个 NULL 字符!:-)

防止 NULL 出现的细微更改:如果我更改 $text 的值(例如,仅更改为“0”或仅更改为“1”或许多其他组合),则不再引入 NULL。如果我将赋值值从“A$1”更改为“$1”,则不再引入 NULL。如果我将“A$1”分配给一个完全不同的变量,则不会将 NULL 引入该变量。如果我在 m// 匹配期间删除了 //g 运算符,则不会引入 NULL。

Perl 大师可以解释一下这种行为吗?我通过谷歌搜索找不到任何东西。

0 投票
2 回答
193 浏览

python - 在 Python 中重新加载模块时管理具有副作用的全局对象

我正在寻找一种方法来正确管理使用某些操作系统资源(如文件或线程)的模块级全局变量。

问题是当重新加载模块时,我的资源必须在创建新的之前正确处理(例如文件关闭或线程终止)。

所以我需要一个更好的模式来管理那些单例对象。

0 投票
2 回答
1552 浏览

java - Java volatile 和副作用

Oracle 关于原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)说:

“一个volatile变量建立了happens-before关系......这意味着......当一个线程读取一个volatile变量时,它不仅会看到对volatile的最新更改,还会看到导致代码的副作用改变。”

我很难解决这个问题。我了解 volatile 变量是如何工作的(在 >= Java 5 中),但我想知道 java 如何决定什么副作用“导致”了 volatile 变量的变化。

所以我想我的问题是:这个保证有什么副作用?

编辑:

所以我了解到,如果线程 A 修改了一个 volatile 变量,然后线程 B 读取它,那么在写入 volatile 变量之前发生的线程 A 的所有写入相对于线程 B(即缓存的值)都是“一致的”受线程 A 上述写入影响的变量在线程 B) 中无效。如我错了请纠正我。

0 投票
1 回答
128 浏览

c++ - 我在这里遗漏了一些简单的东西(运行时执行优先级?)

执行这个简单的代码:

导致(linux):

请解释为什么 *ptr=0 在第二行,而不是在第四行;会不会是“东西”是cout从右到左“提取”的?比 - 它是如何真正工作的(在运行时逐步执行)?

0 投票
1 回答
3770 浏览

java - Guava 中有什么类似于函数式 Java 的效果吗?

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但是让我们面对现实吧,即使存在所有的函数式编程库,Java 也不是一种函数式语言。事实上,一些 FP 库似乎知道并期待这一点。例如在函数式 Java 中,有Effect类。在 Jedi FP 库中,有Command接口。这允许您 - 除其他外 - 将具有类型安全性的命令模式应用于 an 的元素,Iterable而无需讨厌的 for 循环样板。

所以问题是,番石榴中是否有类似的东西?

在接受澄清后编辑

我正在开发一个框架,在某些情况下帮助解决大多数 Java FP 库中固有的“垂直问题”。因此,我实际上不会制作如上所示的代码示例:即,显式声明一个新的类实现及其Command所有垂直噪声 icky-ness,只是为了在声明之后立即应用它。

我更多地考虑实际命令模式的思路,其中可能在其他地方声明了几个可能的命令,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是让创建函数式接口对象(函数、谓词、命令、其他简单的 lambdas)更加地道,而无需简单地将垂直问题移到其他地方。我早就意识到这不在 Guava 的范围内。但由于其他 FP 库中提供了类似命令的界面,我只是想知道 Guava 中是否存在类似物。

使用我的框架的更完整的代码示例可能是这样的:

0 投票
3 回答
560 浏览

python - 我不明白的 Python 副作用

如果我运行它,我会看到在第一次递归时,Test打印行产生的值与Test Here打印行不同。为什么?此代码如何可能影响 的值group?在测试值失败的情况下,我试图将未更改的内容传递group到下一个递归级别group_move,但似乎group在我进行任何递归调用之前就受到了影响。以上与此有何不同:

0 投票
4 回答
282 浏览

c++ - C++ 宏副作用

我不明白为什么结果会是 36。有人可以向我解释这里发生了什么以及预处理器做了什么吗?

非常感谢 :>

0 投票
4 回答
8339 浏览

c++ - 在编译时生成唯一编号

我想为我的标题中的每个类生成唯一的数字,在我的情况下为素数,但假设这应该只是连续的数字,即 1、2、3、4 等。

当然我可以硬编码这些:

这很容易出错,因为实际上这些类并没有那么小,如果我在中间添加一个新类,如果我不想完全放松 ID 的概述,我必须更改以下所有数字。

我希望我能做到以下几点:

但是由于 constexpr 函数调用不会产生副作用,这是不可能的。我认为使用宏这样的结果也是不可能的。

我也会很幸运有这样的事情:

但老实说,我不知道如何实现它。

我可以实现我的目标吗?如果可以,如何实现?

0 投票
2 回答
340 浏览

android - 在 Android Play/Market 中更改现有应用的过滤器和要求的副作用

以前没有关于它的问题,所以我在这里问。

背景:

我在 Play 市场中有一个旧应用程序,有免费版和付费版。我创建了一个新版本,彻底改变并使用不同的支付系统(仅限免费应用 + 应用内购买,不再是付费版本:降低维护成本)。minSdkVersion也从 1.5 更改为 2.1。

由于所有这些差异,我决定上传一个新应用程序,而不仅仅是更新当前应用程序(即,不选择性地为 API 7+ 提供新的 apk --- 多个 APKs)。由于新的支付系统,这一点尤其重要,因为我不想强迫付费的老客户再次购买所有东西。我想让他们一个人呆着,像他们一样快乐(4.4/4.7 评分)。简而言之,我不想“强迫”人们做任何事情。在这种情况下,除了新应用提供的其他东西外,通过应用内购买再次购买相同的东西。

问题:

在向您解释了我的背景之后,它提出了一些明显的问题:

1. 我如何对 API 7+ 用户隐藏旧应用程序,同时仍然让所有当前 API 7+ 客户(即那些已经购买它的客户)可以看到它们?

我最关心的是付费应用程序。我正在考虑推出一个maxSdkVersion设置为 6 (SDK 2.0.1) 的新版本,有效地阻止新的 API 7+ 客户使用旧应用程序。但我担心当前 API 7+ 的客户会突然失去对应用程序的访问权限。这就提出了两个问题:

2. 他们能否持续更新应用程序?猜测“是”是否合理?

3. 即使上一个问题的答案是“是”,我仍然不清楚如果用户卸载应用程序,然后在市场中再次找到它会发生什么(不仅仅是更新)。考虑到同时应用过滤器要求发生变化,它会消失还是仍会出现在他的“已购买”应用列表下?

备注:我会上传一个测试应用程序来查看,但是AFAIK作者不允许购买他自己的应用程序(即使许可证的行为不同),所以我无法测试卸载过滤安装方案。




#######回复答案:#######

@活泼的:

我想你弄错了。我了解多个 APK,当然还有文档。这里的问题远不止于此。

另请注意,这maxSdkVersion已被弃用,因此当您发布新 APK 时,这会给您限制旧 APK 的提议带来一点麻烦。

谢谢你。我错过了。

多个 APK 提供了更简单的用户故事。

如果您这么说(除了我没有引用的其他内容),我认为您可能没有围绕这个问题。请跟我来:

  1. 我有n 个付费客户购买了我当前的 Pro 应用程序版本。
  2. 他们正在使用Pro 版本中的功能集X。
  3. 我现在决定实施应用内购买以提供功能集XY等等......
  4. 不幸的是,应用 API 7+ 进行了这些更改。
  5. 因此,正如您所建议的,我决定提供多个 APK。
  6. 现在,API 7+ 人群突然更新到我的应用程序的这个新版本。
  7. 因为他们更新到新的 APK,所以他们失去了他们的功能集X。他们现在需要再次购买X(从应用内购买菜单中)。我从他们那里拿走了他们已经拥有的东西,尽管是以一种“不那么闪亮”的方式。就像我说的:

你要么再次付钱给我,要么失去你已经拥有的东西。

你现在看到问题了吗?你明白为什么我被迫提供一个新的应用程序吗?还是我仍然没有得到你所说的(我认为没有)?