问题标签 [language-details]

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 投票
5 回答
7181 浏览

c++ - c++中字符整数值的范围

我正在阅读The C++ Programming Language并在其中 Stroustrup 指出 char 的 int 值的范围可以从 0 到 255 或 -127 到 127,具体取决于实现。它是否正确?看起来应该是从-128到127。如果不是,为什么在第二种实现可能性中它们只有255个可能的值,而不是256。

0 投票
5 回答
39281 浏览

c++ - 为什么 (void) 0 在 C 和 C++ 中是无操作?

我在glibc(void) 0中看到了调试 printfs ,如果定义了NDEBUG ,则内部定义为。同样__noop,Visual C++ 编译器也在那里。前者适用于 GCC 和 VC++ 编译器,而后者仅适用于 VC++。现在我们都知道,以上两条语句都将被视为无操作,不会生成相应的代码;但这是我有疑问的地方。

如果是__noop,MSDN 说它是编译器提供的内在函数。来到(void) 0~为什么编译器将其解释为无操作?它是 C 语言的一个棘手用法,还是标准明确说明了它?甚至这与编译器实现有关?

0 投票
3 回答
1784 浏览

python - Python中是否会自动清除临时引用?

这基本上是一个关于临时工寿命的问题。如果函数返回一个对象,但是引用并没有赋值给变量,只是用来调用返回对象的方法,临时引用会自动清除吗?

举一个具体的例子,假设有这个方法调用链:

o.method_a()调用完成时自动清除返回的临时引用method_b(),就好像该行写成这样:

编辑:我对一般答案感兴趣。一旦引用计数下降到 0,CPython 就会终止对象。其他 Python 实现可能不会立即终止对象。我想知道 Python 语言是否像 C++ 一样,它保证临时对象在创建它们的语句结束时被销毁。(除了在 Python 中,问题是临时引用是否在创建它们的语句结束时被清除。)

在 C++ 中,类似的代码可以通过以下方式实现:

C++ 标准规定“临时对象被销毁作为评估完整表达式的最后一步......(在词法上)包含创建它们的点。即使评估以抛出异常结束也是如此。” 在此示例中,这意味着std::shared_ptr<B>调用创建的临时对象A::method_a()会在 full-expression 的计算结束时立即销毁o.method_a()->method_b();。销毁 astd::shared_ptr意味着清除对共享对象的引用。

0 投票
4 回答
44266 浏览

python - 我应该什么时候使用@classmethod,什么时候使用def method(self)?

在集成我以前没有使用过的 Django 应用程序时,我发现了两种不同的方法来定义类中的函数。作者似乎既独特又有意地使用它们。第一个是我自己经常使用的:

另一个是我从不使用的,主要是因为我不明白何时以及将其用于什么用途:

python文档中的classmethod装饰器说:

类方法接收类作为隐式第一个参数,就像实例方法接收实例一样。

所以我猜cls是指Dummy它自己(class不是实例)。我不完全理解为什么会这样,因为我总是可以这样做:

这只是为了清楚起见,还是我错过了最重要的部分:没有它就无法完成的怪异和迷人的事情?

0 投票
5 回答
1215 浏览

java - 为什么我不能创建一个泛型类型的数组?

简而言之,这不会编译:

是因为向后兼容性的问题,还是语言设计中的一些基本因素阻止了它?

0 投票
2 回答
116 浏览

java - 如何在 Java 语言解析器中正确标记“@”符号?

我正在开发一个 Java 源代码解析器,遵循词法句法规范。

不过,我被困在注释上;相关规则是:

@但我在词汇规范中的任何地方都没有看到提到的符号。标记化的正确规则是什么@,或者我在哪里可以找到这样的规则?

我意识到我可以很容易地为此添加一个令牌定义,它甚至可能会起作用——有时。但如果可能的话,我更愿意根据规范正确地做到这一点。

0 投票
4 回答
7515 浏览

php - 如何传入一个空的生成器参数?

我有一个方法,它需要一个生成器加上一些额外的参数并返回一个新的生成器:

此函数的通常用例与此类似:

但问题是有时我需要将空源传递给该merge方法。理想情况下,我希望能够做这样的事情:

这正是我在 C# 中所做的(有一个IEnumerable<T>.Empty属性)。但我在手册中没有看到任何类型的empty生成器。

我已经设法通过使用这个函数来解决这个问题(现在):

这有效。编码:

正确输出:

但这显然不是一个理想的解决方案。将空生成器传递给merge方法的正确方法是什么?

0 投票
1 回答
4609 浏览

dart - 如何编写抽象类构造函数,以便在子类中灵活扩展

我正在尝试实现一个持久的Stack数据结构。我想将其实现为代数数据类型,因此它有两个具体的子类型:非空

此代码在具体实现中引发了两个错误:

我在这里找到了一个似乎可以解决这个问题的示例代码,所以我通过在Stack<T>类中放置一个无参数构造函数来修复它:

但是现在这会导致_EmptyStack<T>构造函数出现问题,这是恒定的:

此外,添加的Stack()构造函数可防止将类用作 mixin。

这些限制似乎迫使班级作者考虑如何扩展班级。从包中扩展Listdart:collection的方式似乎证实了这个结论——有一个完整的单独的类用于扩展,我不能直接扩展List类本身。

我的问题比上面描述的问题更笼统:我怎样才能编写一个类,以便它可以足够灵活地扩展?这包括允许使用以下功能:

  1. 超类中的工厂构造函数
  2. 子类中的普通构造函数
  3. const子类中的构造函数
  4. 用作mixin

虽然我知道作为 mixin 的使用可能是不可能的,甚至是不需要的,但其他点仍然有效。最重要的问题是:为什么我不能extend创建一个带有工厂构造函数的类?这是一种与我熟悉的任何其他 OO 语言不同的行为。

还有相关问题:

编辑:感谢Günter Zöchbauer 的回答,我改进了代码,所以现在它可以完全运行(见下文)。我现在留下的最重要的问题是:为什么工厂构造函数破坏了扩展类的能力?以及如何解决它(除了使用基类作为接口)?一个更简单的例子来说明这一点:

这段代码一切都很好。但是假设我及时回到我的Base班级并想添加工厂方法:

现在每个扩展Base的类都因为unresolved implicit call to super constructor. 那我该怎么办?

来自原始问题的更正代码以供参考:

0 投票
2 回答
83 浏览

matlab - MATLAB 中什么时候发生引用赋值?

这是一个关于 MATLAB 语言的问题。我正在阅读 MathWorks 的“Onramp”教程,我注意到一种奇怪的“通过引用分配”行为(因为没有更好的术语),这与我的期望背道而驰。

我认为在下面,它首先评估括号表达式,生成一个逻辑数组 [1 0 1 1 1 0 0],然后索引v1以获得结果。到目前为止,一切都很好。

下面是让我吃惊的地方。如果运行它,您将看到ans(默认结果变量,一种匿名变量)获取的值[4 1 3 4]是语句左侧的值。我希望分配只写入ans,而是通过引用传递并写入引用数组v1

当然,这与其他语言类似。在print a[3]语法中意味着我们得到 的值a[3],但在a[3] = 1语法中意味着我们为 赋一个新值a[3]。从这个意义上说,唯一的“新”部分是 MATLAB 允许比大多数语言更高级的索引表达式。

这里令人困惑的是,MATLAB 清楚地以两种方式计算表达式。它获取索引值并将它们存储在 ans 中,但随后它会忽略它并将右侧的值放入索引引用的位置。

如果不对表达式进行两次评估,或者在幕后做其他魔术,我看不出它怎么能做到这一点。我不觉得我掌握了评估的顺序/规则。

感谢您对“真正”发生的事情的任何见解。