Questions tagged «language-design»

与编程语言的任何方面的设计有关的问题的标记。

8
为什么数组是协变的,而泛型是不变的?
摘自Joshua Bloch的Effective Java, 数组在两个重要方面不同于通用类型。第一数组是协变的。泛型是不变的。 协变量仅表示如果X是Y的子类型,则X []也将是Y []的子类型。数组是协变的,因为字符串是Object的子类型,所以 String[] is subtype of Object[] 不变式仅表示X是否为Y的子类型, List<X> will not be subType of List<Y>. 我的问题是为什么要在Java中使数组协变的决定?还有其他SO帖子,例如“ 为什么数组不变”,但“列表协变”?,但是它们似乎专注于Scala,我无法跟踪。

10
为什么专用字段专用于类型而不是实例专用?
在C#(和许多其他语言)中,访问相同类型其他实例的私有字段是完全合法的。例如: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } 正如C#规范(第3.5.1节,第3.5.2节)所述,对私有字段的访问是基于类型而不是实例。我一直在与一位同事讨论这个问题,我们正试图提出一个使其如此工作的原因(而不是限制对同一实例的访问)。 我们能想到的最好的参数是进行相等性检查,其中类可能要访问私有字段以确定与另一个实例的相等性。还有其他原因吗?还是某些绝对地意味着它必须像这样工作的黄金原因,否则将完全不可能?


5
Java为什么不允许Throwable的通用子类?
根据Java语言分隔,第3版: 如果泛型类是的直接子类或间接子类,则是编译时错误Throwable。 我想理解为什么做出这个决定。通用异常有什么问题? (据我所知,泛型只是编译时的语法糖,Object无论如何它们都将转换为.class文件,因此有效地声明泛型类就好像其中的所有内容都是Object。。如果我错了,请更正我)


7
为什么Ruby既有私有方法又有受保护的方法?
在阅读本文之前,我认为Ruby中的访问控制是这样工作的: public-可以被任何对象(例如Obj.new.public_method)访问 protected -只能从对象本身以及任何子类内部访问 private -与protected相同,但是该方法在子类中不存在 但是,除了您不能使用显式接收器调用方法(即有效,但不能)之外,看起来protected和private动作相同。privateself.protected_methodself.private_method 这有什么意义呢?在什么情况下,您不希望使用显式接收器调用方法?


9
为什么将switch语句设计为需要中断?
给出一个简单的switch语句 switch (int) { case 1 : { printf("1\n"); break; } case 2 : { printf("2\n"); } case 3 : { printf("3\n"); } } 在情况2中没有break语句,这意味着将在情况3的代码内继续执行。它是这样设计的。为什么做出这个决定?与为块提供自动中断语义相比,这有什么好处?有什么根据?
139 c  language-design 

28
为什么不在“捕获”或“最终”范围内的“尝试”中声明变量?
在C#和Java(可能还有其他语言)中,在“ try”块中声明的变量不在相应的“ catch”或“ finally”块中。例如,以下代码无法编译: try { String s = "test"; // (more code...) } catch { Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead } 在此代码中,在catch块中对s的引用发生编译时错误,因为s仅在try块的范围内。(在Java中,编译错误是“无法解决”;在C#中,它是“名称s在当前上下文中不存在”。) 解决此问题的一般方法似乎是在try块之前而不是在try块内声明变量: String s; try { s = "test"; // (more code...) } catch { Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead } 但是,至少对我来说,(1)感觉像一个笨拙的解决方案,(2)它导致变量的范围比程序员预期的范围大(方法的整个其余部分,而不仅仅是在上下文中)。最终尝试捕获)。 我的问题是,此语言设计决定(使用Java,C#和/或任何其他适用的语言)背后的基本原理是什么?

10
为什么python dict.update()不返回对象?
我正在尝试: award_dict = { "url" : "http://facebook.com", "imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png", "count" : 1, } def award(name, count, points, desc_string, my_size, parent) : if my_size > count : a = { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, } a.update(award_dict) return self.add_award(a, siteAlias, alias).award …

13
为什么C ++需要单独的头文件?
我从来没有真正理解过为什么C ++需要一个单独的头文件,其功能与.cpp文件中的功能相同。这使得创建类和重构它们非常困难,并且向项目中添加了不必要的文件。然后就是必须包含头文件,但是必须显式检查它是否已经包含在内的问题。 C ++于1998年获得批准,为什么要这样设计?拥有单独的头文件有什么优点? 后续问题: 当我仅包含.h文件时,编译器如何查找其中包含代码的.cpp文件?它是否假定.cpp文件与.h文件具有相同的名称,或者实际上查看目录树中的所有文件?

24
为什么变量名不能以数字开头?
当我问一个问题:“为什么变量名不能以数字开头?”时,我正与一个新的C ++开发人员一起工作。 除了一些数字可以包含文本(123456L,123456U)外,我无法给出答案,并且如果编译器认为带有一定数量的字母字符的所有内容都是变量名,那将是不可能的。 那是正确的答案吗?还有其他原因吗? string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

9
Ruby为什么不支持i ++或i--(增减运算符)?
前/后递增/递减运算符(++和--)是相当标准的编程语言语法(至少对于过程语言和面向对象的语言而言)。 Ruby为什么不支持它们?我了解您可以使用+=和来完成相同的操作-=,但是排除这样的事情似乎有点武断,尤其是因为它是如此简洁和传统。 例: i = 0 #=> 0 i += 1 #=> 1 i #=> 1 i++ #=> expect 2, but as far as I can tell, #=> irb ignores the second + and waits for a second number to add to i 我知道这Fixnum是一成不变的,但是如果+=可以实例化一个新的Fixnum并进行设置,为什么不这样做++呢? 包含=字符的作业的一致性是唯一的原因,还是我缺少某些东西?

9
为什么String switch语句不支持null大小写?
我只是想知道为什么Java 7 switch语句不支持null大小写而是抛出NullPointerException?请参阅下面的注释行(示例摘自上的Java教程文章switch): { String month = null; switch (month) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; case "march": monthNumber = 3; break; //case null: default: monthNumber = 0; break; } return monthNumber; } 这样可以避免if在每次switch使用之前都进行空检查的条件。

8
为什么标头中包含C ++内联函数?
注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么要按原样完成它们。 类成员函数的声明不需要将函数定义为inline,而只是函数的实际实现。例如,在头文件中: struct foo{ void bar(); // no need to define this as inline } 那么,为什么一类的内联函数的实现必须要在头文件?为什么不能将内联函数放在.cpp文件中?如果我尝试将内联定义放入.cpp文件中,则会出现以下错误: error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.