问题标签 [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 回答
509 浏览

functional-programming - 这种声明式 I/O 方法有什么问题(如果有的话)

我不确定这到底有多少属于“编程”而不是“程序语言设计”。但问题是这样的:

说,为了简单起见,我们有两个“特殊”列表/数组/向量/为了简单起见,我们只是称为“端口”,一个称为“端口”,另一个称为“端口stdInstdOut。这些在概念上分别代表

  • 在程序执行期间给予程序的所有用户输入
  • 在程序执行期间写入终端的所有输出

在受 Haskell 启发的伪代码中,应该可以创建这个完全声明性的程序:

哪个会达到预期,要求两个数字,然后打印他们的产品。诀窍在于 stdOut 表示程序完成时写入终端的字符串列表,而 stdIn 表示输入字符串列表。类型错误以及需要采取一些保护措施才能在输入新行后仅打印下一行的事实为了简单起见将其放在一边,解决这个问题可能很容易。

那么,在我开始实施这个想法之前,有没有我忽略的陷阱?我不知道已经存在类似的构造,因此不考虑我忽略的明显陷阱是天真的。

否则,我当然知道:

如果这些结果需要以与上述类似的方式交织在一起,那将是一个错误。

0 投票
4 回答
1003 浏览

python - 使用这个 setitem 函数来克服列表理解限制是不是很不合常理?

0 投票
10 回答
5809 浏览

unit-testing - 有没有办法针对副作用进行单元测试?

任何代码都可能产生副作用。大多数时候,副作用可能是糟糕设计和/或需要重构的标志,但在单元测试时,我发现很难进行测试。考虑以下示例:

测试以下扩展:

测试将通过,但没有防范副作用。调用的影响PokeAround将完全被忽视。

鉴于您不知道是什么PokeAround- 它可能是任何东西!- 你如何编写一个防止它的测试?有可能吗?

澄清: 有一些评论PokeAround认为完全未知是一种非常不可能的情况,因为我们在编写测试时有来源。不过,我问这个问题的原因是想找到一种方法来防止后来添加的副作用。也就是说,当我编写测试时,我的 exension 方法可能如下所示:

测试通过,一切正常。然后,一个月后,当我休假时,一位同事添加了PokeAround电话。我希望我已经写的测试失败,因为他做到了。

0 投票
2 回答
245 浏览

views - 如何使用 CouchApp 和 CouchDB 旋转横幅广告?

对于上下文:这是一个 HTML 应用程序,几乎没有浏览器端 JavaScript。我不能轻易改变它,所以需要在服务器上这样做。

CouchDB 的构建没有副作用。这很公平。但是,我似乎没有任何方法可以用节目、视图、列表来改变显示给用户的后续请求,或者基于用户对象,而无需写入数据。

获取文档的请求是否会导致创建新记录?我猜不是因为那会是副作用。

但是,如果可以,您可以创建一个日志,然后有一个视图,该视图可以选择广告公司一组描述广告的文档,这些文档在显示之前的广告时会受到日志中的更改的影响。

我实际上不会在我的网站上展示广告,我将提供提示、文章摘要和因页面加载而异的次要功能。

任何建议表示赞赏。

对于我需要的其余功能,我已经开始思考如何使用谷物,但这一点似乎与 couchdb 的工作方式相反。

0 投票
3 回答
4509 浏览

unit-testing - 具有副作用的单元测试功能?

假设您正在编写一个函数来检查是否通过适当的 URL 访问了页面。该页面有一个“规范”存根 - 例如,虽然可以在 stackoverflow.com/questions/123 访问页面,但我们更愿意(出于 SEO 原因)将其重定向到 stackoverflow.com/questions/123/how-do -i-move-the-turtle-in-logo - 并且实际的重定向安全地包含在它自己的方法中(例如,redirectPage($url)),但是如何正确测试调用它的函数呢?

例如,采用以下函数:

如果您要对 checkStub() 函数进行单元测试,重定向不会妨碍您吗?

这是一个更大问题的一部分,其中某些功能似乎变得太大并离开单元测试领域并进入集成测试领域。我的脑海中立即想到路由器和控制器存在这些问题,因为测试它们必然会导致页面的生成,而不是仅限于它们自己的功能。

我只是在单元测试中失败了吗?

0 投票
3 回答
348 浏览

.net - Rx:observables 是否像 IEnumerable 一样“可重复”,如果不是,这段代码是如何工作的?

昨天,我观看了编写您的第一个 Rx 应用程序(在第 9 频道)的截屏视频,其中 Wes Dyer 展示了如何使用响应式扩展 (Rx)实现 Drag 'n' Drop 。我仍然不明白的东西:

在截屏视频快结束时,韦斯·戴尔键入以下内容:

简而言之,q是一个将鼠标移动坐标增量推送给其订阅者的 observable。

我不明白的是怎么mm.Zip(mm.Skip(1), ...)可能工作!?

据我所知,IObservable在这个意义上是不可枚举的IEnumerable。由于 的“拉”性质IEnumerable,它可以一次又一次地迭代,总是产生相同的项目。(至少所有表现良好的枚举都应该是这种情况。)IObservable工作方式不同。项目被推送给订阅者一次,就是这样。在上面的例子中,鼠标移动是单个事件,如果没有记录在内存中就不能重复。

那么,.Zip.Skip(1)可能的组合如何工作,因为他们正在处理的鼠标事件是单一的、不可重复的事件?这个操作不需要mm独立“查看”两次吗?


作为参考,以下是 的方法签名Observable.Zip


PS:我刚刚看到运营商的另一个截屏视频Zip非常有见地。

0 投票
3 回答
398 浏览

c++ - 构造函数中的外部副作用

看看这段代码:

尝试猜测object将被保存在哪里......是的,你猜对了。我觉得这太神奇了,我想写一些类似object.Save(file)的东西,但没有必要。显然里面有一个全局变量,它在构造函数framework_i_hate.h期间被修改。file您如何看待构造函数内部的这种副作用?

如何隐藏这种行为?

谁猜框架的奖金。

0 投票
7 回答
1503 浏览

haskell - 对调用者来说看起来很纯粹但内部使用突变的函数

我刚拿到我的Expert F# 2.0副本,看到了这个声明,这让我有些惊讶:

例如,必要时,您可以对算法开始时分配的私有数据结构使用副作用,然后在返回结果之前丢弃这些数据结构;然后,总体结果实际上是一个无副作用的函数。与 F# 库分离的一个例子是库的 List.map 实现,它在内部使用了变异;写入发生在其他代码无法访问的内部分离数据结构上。

现在,显然这种方法的优势在于性能。我只是好奇是否有任何缺点——副作用可能带来的任何陷阱是否适用于这里?并行性是否受到影响?

换句话说,如果抛开性能,List.map以纯粹的方式实现会更好吗?

(显然这特别涉及 F#,但我也对一般哲学感到好奇)

0 投票
2 回答
3542 浏览

c++ - 未排序的值计算(又名序列点)

很抱歉再次打开这个话题,但是考虑这个话题本身已经开始给我一个未定义的行为。想要进入定义明确的行为区域。

给定

我认为上述表达式(按此顺序)为

现在谈到这里的行为是来自C++ 0x的重要引述。

$1.9/12-“表达式(或子表达式)的评估通常包括值计算(包括确定对象的身份以进行左值评估和获取先前分配给对象以进行右值评估的值)和副作用的启动。”

$1.9/15-“如果标量对象的副作用相对于同一标量对象的另一个副作用使用同一标量对象的值的值计算是未排序的,则行为未定义。”

[注意:与不同参数表达式相关的值计算和副作用是无序的。——尾注]

$3.9/9-“算术类型 (3.9.1)、枚举类型、指针类型、指向成员类型的指针 (3.9.2)、std::nullptr_t 和这些类型的 cv 限定版本 (3.9.3) 统称为标量类型。”

  • 在 Expr1 中,表达式i(第一个参数)的评估相对于表达式的评估operator++(i)(具有副作用)是无序的。

    因此 Expr1 具有未定义的行为。

  • 在 Expr2 中,表达式i(第一个参数)的评估相对于表达式operator++(i, 0)(具有副作用)的评估是无序的。

    因此 Expr2 具有未定义的行为。

  • 在 Expr3 中,operator++(i)需要在调用外部参数之前完成对单独参数的评估operator++

    因此,Expr3 具有明确定义的行为。

  • 在 Expr4 中,表达式i(第一个参数)的计算相对于operator[](operator++(i, 0)(有副作用)的计算是无序的。

    因此 Expr4 具有未定义的行为。

这种理解正确吗?


PS OP中分析表达式的方法不正确。这是因为,正如@Potatoswatter 所指出的那样 - “第 13.6 条不适用。请参阅 13.6/1 中的免责声明,“这些候选函数参与 13.3.1.2 中所述的运算符重载解决过程,并且不用于其他目的。 “它们只是虚拟声明;不存在与内置运算符相关的函数调用语义。”

0 投票
3 回答
460 浏览

python - 为什么改变全局不会出错?

为什么 Python 不允许在函数中更改全局声明列表?

重新更新

如果我将分配给具有相同名称的变量,则该行之前的操作将变为错误,而不是添加的行(我猜是字节码编译器发现了它)。