小编tor*_*gen的帖子

为什么具有无用的孤立“静态”的函数被认为是不纯的?

在维基百科关于Pure function 的文章中,有一个像这样的不纯函数的例子:

void f() {
  static int x = 0;
  ++x;
}
Run Code Online (Sandbox Code Playgroud)

附注“因为局部静态变量的突变”。

我想知道为什么它不纯?它从单元类型到单元类型,因此对于相同的输入,它总是返回相同的结果。而且它没有副作用,因为即使它有static int变量,它也无法被除 this 之外的任何其他函数观察到f(),因此没有其他函数可能使用的全局状态的可观察突变。

如果有人争辩说不允许任何全局突变,无论它们是否可观察,那么现实生活中的任何函数都不能被认为是纯函数,因为任何函数都会在堆栈上分配其内存,而分配是不纯的,因为它涉及与MMU 通过操作系统,并且分配的页面可能驻留在不同的物理页面中,依此类推。

那么,为什么这种无用的孤立static int会使函数变得不纯?

c++ functional-programming category-theory

4
推荐指数
1
解决办法
139
查看次数

d2:部分已知结构的不变性

在D中,immutable是传递性的,因此禁止对任何不可变结构域进行赋值.据我所知,永远不变的结构变量永远不会被改变,而且它的内容也是如此.

但是,如果我宣布这样的事情怎么办?

struct OpaqueData;
immutable(OpaqueData*) data;
Run Code Online (Sandbox Code Playgroud)

D如何保证在D中没有实现并且可能具有间接性的结构的传递不变性?

什么是在不可变类中封装这种指针到不透明数据的正确方法?

d immutability

2
推荐指数
1
解决办法
96
查看次数

在Node.js中导入钩子

我遇到过这个问题,这个问题可以通过Python中的import hook解决.在Node.js中是否有类似的机制,允许在安装挂钩后拦截对require()的任何调用?

我试过以下:

originalRequire = global.require;

global.require = function(module) {
    console.log('Importing ' + module + '...');

    return originalRequire(module);
};
Run Code Online (Sandbox Code Playgroud)

但这没有任何作用.有任何想法吗?

javascript hook require node.js

2
推荐指数
1
解决办法
1119
查看次数

在sizeof()中取消引用指针类型

我有以下结构:

typedef struct _foo_t {
    int bar;
    float buzz;
    char quux[40];
} *const foo_t;
Run Code Online (Sandbox Code Playgroud)

有没有办法获得结构的大小,就像通过它完成sizeof(struct _foo_t),但只使用名称foo_t?我试过了sizeof(*foo_t),但那不编译.

c syntax types pointers dereference

2
推荐指数
1
解决办法
4204
查看次数

将对象转换为数组的最佳方法

我有一个以下语法的对象文字:

const loader = {
    "0": "b",
    "1": "a",
    "2": "r",
    // arbitrary extra fields:
    "foo": 123,
    "quux": 456,
}
Run Code Online (Sandbox Code Playgroud)

我想将它转换为数组["b", "a", "r"]然后转换为字符串"bar",这是我的最终目标.我不需要任何额外的字段,如果有的话,可以安全地丢弃它们.

它很诱人Array.from(loader),但不幸的是Array.from期望length属性出现,我没有.

鉴于在我的情况下不保证对象文字键顺序,这是我迄今为止提出的最简洁的解决方案:

function convert(obj) {
    const a = [];
    for (const k in obj) {
        a[k] = obj[k];
    }
    return a.join('');
}
Run Code Online (Sandbox Code Playgroud)

虽然我不喜欢它,但它对我来说似乎是多余的和不优雅的.有什么我可能错过的吗?我可以自由使用ES6中的任何东西.

javascript ecmascript-6

2
推荐指数
1
解决办法
56
查看次数

如何防止引用返回的私有结构发生变异

我有以下代码:

struct MyStruct {
    int a;
    int b;
};

class Foo {
public:
    MyStruct const &getValue() {
        return value;
    }

private:
    MyStruct value{10, 20};
};

int main() {
    Foo foo{};
    auto v = foo.getValue();
    v.a = 42; // compiles! it shouldn't!
}
Run Code Online (Sandbox Code Playgroud)

我想返回一个对私有成员的引用,但不允许调用者改变这个引用的内容。仅声明返回类型MyStruct const &是不够的,因为它可能将引用本身定义为 const,而不是对象引用指向的对象。但是,MyStruct& const使用“'const' 限定符将返回类型声明为失败可能不适用于引用”。我相信我可能在这里遗漏了一些东西。

我本可以通过声明MyStruct所有 const 字段来解决这个问题,但我想在我的类中自己改变它——只允许调用者这样做。

怎么可能呢?

c++ c++20

2
推荐指数
1
解决办法
55
查看次数

Python self.assertRaises

我有一个如下的小代码,请帮助我以正确的方式写这个.我想检查ID是否存在value,如果不存在则会引发异常.

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})

with self.assertRaises(IndexError, value[0]["ID"]):
    print "not an error"
Run Code Online (Sandbox Code Playgroud)

python unit-testing assertraises python-unittest

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

从TDD开始可以测试为绿色吗?

想象一下我有功能foo():

var foo = function(string) {
    return string.replace(/a/g, '');
};
Run Code Online (Sandbox Code Playgroud)

我有以下测试工作:

  1. foo() 存在;
  2. foo()a从字符串中删除条带,没有字符串就没有字符串a;
  3. foo()TypeError如果给出别的东西而不是字符串则抛出;

问题在于测试#3 - 但它从一开始就是绿色,这不是我的优点.我希望写下这样的东西:

var foo = function(string) {
    if (typeof string !== 'string') {
        throw new TypeError('argument should be a string');
    }

    return string.replace(/a/g, '');
};
Run Code Online (Sandbox Code Playgroud)

但我不能,因为没有测试.所以foo()真的抛出TypeError,但不是因为错误类型的参数,而是因为null,undefined,number,array,boolean,regexp等作为参数给出的对象不提供replace()方法.

我想我需要这个测试,只是因为JS团队可能会TypeError将此特定情况更改为类似的情况MissingMethodError,但我会违反Red> Green> Refactor原则.我该如何解决这种情况?

javascript testing tdd methodology unit-testing

0
推荐指数
1
解决办法
70
查看次数