在维基百科关于Pure function 的文章中,有一个像这样的不纯函数的例子:
void f() {
static int x = 0;
++x;
}
Run Code Online (Sandbox Code Playgroud)
附注“因为局部静态变量的突变”。
我想知道为什么它不纯?它从单元类型到单元类型,因此对于相同的输入,它总是返回相同的结果。而且它没有副作用,因为即使它有static int变量,它也无法被除 this 之外的任何其他函数观察到f(),因此没有其他函数可能使用的全局状态的可观察突变。
如果有人争辩说不允许任何全局突变,无论它们是否可观察,那么现实生活中的任何函数都不能被认为是纯函数,因为任何函数都会在堆栈上分配其内存,而分配是不纯的,因为它涉及与MMU 通过操作系统,并且分配的页面可能驻留在不同的物理页面中,依此类推。
那么,为什么这种无用的孤立static int会使函数变得不纯?
在D中,immutable是传递性的,因此禁止对任何不可变结构域进行赋值.据我所知,永远不变的结构变量永远不会被改变,而且它的内容也是如此.
但是,如果我宣布这样的事情怎么办?
struct OpaqueData;
immutable(OpaqueData*) data;
Run Code Online (Sandbox Code Playgroud)
D如何保证在D中没有实现并且可能具有间接性的结构的传递不变性?
什么是在不可变类中封装这种指针到不透明数据的正确方法?
我遇到过这个问题,这个问题可以通过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)
但这没有任何作用.有任何想法吗?
我有以下结构:
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),但那不编译.
我有一个以下语法的对象文字:
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中的任何东西.
我有以下代码:
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 字段来解决这个问题,但我想在我的类中自己改变它——只允许调用者这样做。
怎么可能呢?
我有一个如下的小代码,请帮助我以正确的方式写这个.我想检查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) 想象一下我有功能foo():
var foo = function(string) {
return string.replace(/a/g, '');
};
Run Code Online (Sandbox Code Playgroud)
我有以下测试工作:
foo() 存在;foo()a从字符串中删除条带,没有字符串就没有字符串a;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 ×3
c++ ×2
unit-testing ×2
assertraises ×1
c ×1
c++20 ×1
d ×1
dereference ×1
ecmascript-6 ×1
hook ×1
immutability ×1
methodology ×1
node.js ×1
pointers ×1
python ×1
require ×1
syntax ×1
tdd ×1
testing ×1
types ×1