问题标签 [rationale]
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.
c++ - C 中的空结构与 C++ 中的空结构
为什么 C 中的空结构违反约束?为什么这条规则在 C++ 中会发生变化?
有什么历史原因吗?
c++ - 为什么 std::swap 被移到?
为什么std::swap
已移至<utility>
C++11 的标头?
N3290 C.2.7 说:
17.6.3.2
对原始功能的影响:功能交换移动到不同的标题
理由:移除对交换的依赖。
<algorithm>
对原始功能的影响:已编译的有效 C++ 2003 代码预期交换在其中,
<algorithm>
可能必须改为包含<utility>
.
我无法理解粗体部分。正在谈论什么样的依赖,为什么?
dht - DHT 是如何工作的?
我从 wiki 中获得了关于 DHT 的基本概念:
存储数据:
在 DHT 网络中,每个节点负责特定范围的key-space
. 要将文件存储在 DHT 中,首先,hash the file's name to get the file's key
; 其次,send a message put(key, file-content) to any node of the DHT
消息将被转发到负责的节点,key
该节点将存储该对(key, file-content)
。
获取数据:
从 DHT 获取文件时,首先对文件名进行哈希处理以获取key
; 第二次向任何节点发送消息get(key)
,中继消息直到......
问题:
- 要存储文件,我们可以散列文件的名称以获取它
key
,但 wiki 说:
在现实世界中,密钥 k 可以是文件内容的散列而不是文件名的散列,以提供内容可寻址的存储,因此文件的重命名不会阻止用户找到它。
哈希文件的内容?我应该如何知道文件的内容?如果我已经知道文件的内容,那我为什么要在 DHT 中搜索它?
根据 wiki,每个参与节点都会腾出一些空间来存储文件。那么这是否意味着,如果我参与 DHT,我必须存储我负责的
spare 10G disk space
那些文件?key falls into the specific key-space
如果我确实应该腾出一些磁盘空间来存储这些文件,那么我应该如何将它们存储
(key, file-content)
在磁盘上?我的意思是,文件应该被安排到B-tree
我的磁盘上吗?当查询发生时,我的计算机如何响应?我假设首先检查
queried key
,如果在我的key-space
,然后corresponding file
在我的磁盘上找到 。正确的?
powershell - 为什么使用 .Invoke() 调用 Powershell 脚本块会返回一个集合?
似乎调用 Powershell 脚本块(通过调用.Invoke()
方法)总是会产生一个集合。具体来说,类型的集合
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
即使调用空脚本块 ( {}.Invoke()
) 也会返回一个集合。使用调用运算符 ( &
) 调用相同的脚本块会产生通常预期的返回值(标量或[object[]]
)。
如果您需要一个集合而不是数组,这会很方便,但这似乎有点违反直觉。
有谁知道它为什么会这样?
编辑:
我知道有两种不同的调用,.Invoke()
并且.InvokeReturnAsIs()
来自阅读语言规范。那是我第一次注意到它。
我只是不明白命名约定背后的原因以及它的机制似乎工作的方式。查看文档,我认为默认调用方法不是在 Powershell 中调用脚本块时使用的方法。似乎.InvokeReturnAsIs()
只返回一个对象流,然后如果有多个对象,则Powershell将其包装到一个对象数组中,如果只有一个对象则为标量,如果没有则创建一个空对象,就好像有一个隐式管道那里。Using.Invoke()
总是返回一个集合,而 Powershell 将其保留为一个集合。
c++ - C++11 是否改变了显式调用 std::swap 以确保找到位于 ADL 的交换的行为,例如 boost::swap?
背景
对于这个问题,请考虑以下代码:
在 C++03 中,这个实现do_swap
将被认为是“损坏的”:
通过显式指定std::
,它禁止ns::swap
通过依赖于参数的查找找到。(然后编译失败,因为std::swap
试图复制 a foo
,这是不允许的。)相反,我们这样做:
Nowns::swap
被发现std::swap
,并且由于不那么专业,所以不使用。它更丑陋,但它有效并且事后看来是可以理解的。boost::swap
为我们很好地包装了这个(并提供了数组重载):
问题
因此,我的问题是:是否具有C++11 中std::swap
的行为?boost::swap
如果不是,为什么?
对我来说,这似乎很明显。任何被更改破坏的代码一开始都可能非常脆弱(算法和容器,如std::sort
and std::vector
,未指定;允许实现调用 ADL 交换或不确定地调用),因此更改会更好。另外,std::swap
现在是为数组定义的,所以改变肯定不是不可能的。
然而,虽然 §17.6.3.2 规定swap
标准库中的所有调用都必须在没有std::
限定的情况下完成(解决上述算法和容器的问题),但它并没有涉及到std::swap
自身。它甚至给出了交换值的示例,包括using std::swap;
. 同样,第 20.2.2 节(在哪里std::swap
指定)没有对 ADL 说一句话。
最后,GCC 并没有在他们的std::swap
实现中启用 ADL(MSVC 也没有,但这没什么好说的)。所以我一定是错的,std::swap
采取的行为boost::swap
,但我不明白为什么没有做出改变。:(而且我并不孤单!
base64 - 要求数据 URI 进行 Base64 编码的基本原理是什么?
数据 URI允许将图像等外部资源直接内联到网页内部。考虑到数据 URI 可以更有效地以其他简单格式(例如 8 位 ASCII)编码,那么历史上或当前的设计理由是什么?
c++ - C++ 中枚举访问语义背后的基本原理
有人可以阐明访问 C++ 类中定义的枚举的语义吗?
特别是,为什么枚举成员是通过类名而不是枚举本身来访问的?鉴于 theenum
是容器/范围,就像namespace
和class
是一样,为什么访问容器的元素时它是一个enum
而不是当它是一个时class
?
给定
为什么enum1
mynamespace::myclass::enum1
and not的完全限定名称是mynamespace::myclass::myenum::enum1
?
虽然后者“有效”,但它不是“推荐”的调用方式,一些编译器会在那里抛出警告。恕我直言,它不仅应该是正确的,而且应该是访问它的唯一方式。
它产生了非常奇怪的访问规则,并且当您enum1
在不同的枚举中添加新的(此时您必须添加限定符)时使事情变得非常奇怪。
真的,它违背了枚举的目的。枚举的成员实际上是类的成员而不是枚举的成员,我必须说我发现其他语言(例如 C#)中的行为更可取。
我想这是为了保持与 C 的兼容性,但我不明白为什么在访问语义中要求枚举名称会是更好的选择......我想使类名可选将是保持 C 兼容性的选项.
c# - Java 构造函数不是那么直观。或者可能不是 Java,而是不直观的 C#
给定这个 Java 代码,它会输出0 和 4:
使用相同的 C# 代码,输出4 和 4
使用系统;
虽然我发现 Java 上的输出应该是 4 和 4,但答案实际上是 Java 上的 0 和 4。然后我用C#试了一下,答案是4和4
是什么赋予了?Java 的基本原理是,在构建 B 期间,A 仍在初始化(因此,如果 Java 说 A 仍在初始化,我假设 B 仍在初始化),因此默认值应为 0。因此在 Java 中输出为 0 和 4。
为什么 C# 构造函数的行为与 Java 不同,反之亦然?
mysql - 数据库设计,我的数据库合理吗?一个主键到多个外键?
我有一个想法,我想执行并且在涉及表之间的关系时对我的数据库设计非常生疏。我希望能够在 3 个<input type="text">
字段中输入 3 种成分并搜索所有包含这些成分的食谱。
我有3张桌子...
- 配料
- 食谱
- 菜单
粗体的列是我的主键,我希望斜体的列是外键。
示例 - iName 是 iName1 iName2 和 iName3 的主键。
配料
iName - iType
食谱
mName - iName1 - iName2 - iName3 - 方法
菜单
mName - mDiscription - 过敏
我的问题是......我的表之间的关系是否足够有效,可以满足我的需求?例如,如果我想加入查询会是什么
对这个主题的任何启示都会有很大的帮助,我已经有一个表版本的数据库并且我使用的查询工作正常,我只想重新设计我的数据库并修改我的查询以适应。
c# - 超类的公共非虚拟成员干扰子类中的覆盖的设计原理
这背后的设计原理是什么:
好的:
错误的:
为什么非虚拟方法无论如何都会干扰覆盖虚拟方法?
编辑:更多解释。第一种情况:编译器检查该方法是否为私有(新),因此它允许 C.DoWork() 类覆盖 A.DoWork() 类(不混合虚拟和非虚拟(B.DoWork())方法)。第二种情况:编译器看到声明了 public(new)void 并且它任意(?)破坏了 C 类中的覆盖。现在,如果我想声明 new virtual DoWork() 我可以这样做,如果我想禁止覆盖,我本可以使用密封说明符。但是在这种情况下,我将 public void DoWork() 写为声明正常的非虚拟方法,并且我不希望它像在私有情况下那样参与虚拟继承链。在第二个示例中,我期望:
像在私人情况下一样打印 C。