问题标签 [static-typing]
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.
static-typing - 静态类型和动态类型的定义
这两个定义哪一个是正确的?
- 静态类型- 在编译时检查类型匹配(因此只能应用于编译语言)
- 动态类型- 在运行时检查类型匹配,或者根本不检查。(这个术语可以应用于编译或解释语言)
- 静态类型- 类型被分配给变量,所以我会说'x is of type int'。
- 动态类型- 类型被分配给值(如果有的话),所以我会说'x 持有一个 int'
根据这个定义,静态或动态类型不依赖于编译或解释语言。
哪个是正确的,或者两者都不完全正确?
ios - 在使用#DEFINE 语句时,您是否失去了静态打字能力?
定义时,我似乎失去了静态打字能力,
去做这个,
Xcode 不知道doSomething是什么,尽管只要我知道自己在做什么,它就会编译并运行良好,而且doSomething实际上存在于 myAppDelegate 上!
有什么办法可以克服这个吗?
java - 静态类型的优点?
我并不是说静态类型是最好的,只是想知道它到底有什么优势。我以为他们是:
- 更快的代码
- 尽早发现一些错误
看看我自己的使用(在 Java 中),我主要为编译器工作。当它捕获到类型错误时,通常只是类型中的错误中的错误,而不是代码错误 - 事实上,我不记得它曾经捕获过实际的错误(尽管它可能有)。
有时,我会通过代码来收紧类型——例如,可能有一组类实现了某个接口 I,因此可以容纳任何这些类的字段被赋予类型 I。但这可以结束-broad:有时还有一些字段只能包含这些类的一个子集,因此可以通过创建一个新接口 J 来收紧类型系统,该接口仅由该类的子集实现,并且这些字段被赋予类型 J。虽然这更“正确”,它非常乏味,如果发生变化,它会很脆弱。
所以,我认为更快的代码是主流编译语言(Java、C#、C、C++、objective-C)中静态类型的主要好处,而类型安全则远在第二位——尽管也有一些领域是类型安全的非常有用,例如用于集成电路验证的 ml 语言。我还听说静态类型在数据库中很重要。
但我认为还有另一个优势:
- 文件
您可以查看方法并了解有效参数的文档。对于自动生成的文档,参数类型超链接到可用的接口和实现。我不认为这是一个杀手锏,但它是真实的。
显然,python 和 ruby 等在没有静态类型的情况下做得很好。我只是想知道它的优点是什么-您怎么看?你有什么经验?
type-inference - 具有静态、结构类型和全局类型推断的命令式语言
我知道像 Haskell 这样的语言是静态类型的并且具有类型推断。但是是否存在具有全局类型推断的非函数式语言,相当于具有类型推断和结构类型的 C 语言。
c# - Typedef 用于 C# 中的索引,具有静态类型检查,无需运行时开销
使用具有复杂索引的多维数组是很常见的情况。当所有索引都是整数时,这确实令人困惑且容易出错,因为您可以轻松地混淆列和行(或您拥有的任何内容)并且编译器无法识别问题。实际上应该有两种类型的索引:行和列,但它不是在类型级别上表示的。
这是我想要的一个小例子:
加起来:
- 应静态检查索引是否混淆(类型检查)
- 重要的!它们应该是运行时高效的,因为将整数包装到包含索引的自定义对象然后将它们解包回来对性能来说是不合适的
- 它们应该可以隐式转换为整数,以便用作本机多维数组中的索引
有什么办法可以做到这一点?完美的解决方案类似于typedef
仅编译成平面整数的编译时检查。
html - TypeScript:类型系统的问题
我只是在 VisualStudio 2012 中测试打字稿,但它的类型系统有问题。我的 html 网站有一个 ID 为“mycanvas”的画布标签。我正在尝试在此画布上绘制一个矩形。这是代码
不幸的是,VisualStudio 抱怨说
“HTMLElement”类型的值上不存在属性“getContext”
它将第二行标记为错误。我认为这只是一个警告,但代码无法编译。VisualStudio 说
有构建错误。您想继续并运行最后一次成功的构建吗?
我根本不喜欢这个错误。为什么没有动态方法调用?毕竟 getContext 方法肯定存在于我的画布元素上。但是我认为这个问题很容易解决。我刚刚为画布添加了类型注释:
但是类型系统仍然不满意。这是新的错误消息,这次是在第一行:
无法将“HTMLElement”转换为“HTMLCanvasElement”:“HTMLElement”类型缺少“HTMLCanvasElement”类型中的“toDataURL”属性
好吧,我完全支持静态类型,但这使得语言无法使用。类型系统要我做什么?
更新:
Typescript 确实不支持动态调用,我的问题可以通过类型转换来解决。我的问题基本上是这个TypeScript 的副本:casting HTMLElement
types - 表示一组函数及其键入规则
我想表示一组函数及其键入规则,并且正在考虑数据结构......例如,
一些评论: 函数和规则的名称总是唯一的;一个函数(例如 PLUS)总是有固定数量的参数,并且可以有几个与之相关的打字规则;一个打字规则有一个名称(例如,加号整数)、一个前提、一个结论和一个优先级。可能有 2 个打字规则共享相同的前提,但给出不同的结论,在这种情况下,是优先级造成了差异。
稍后,我需要定义如下函数:
为此,我不知道是否有定义这些类型的常规方式......目前,我想象一种方式如下:
几个问题:
1)与数组相比,定义rules
为 的列表是否是个好主意...rule
2)关于 和 的关系func
,rules
有几种选择:rules
做为 的记录字段func
;制作func
为记录字段rule
;func
制作和的哈希表rules
;func
从到制作地图rules
。我真的不知道哪种方式更好...
另一个需要考虑的方面是这个数据库的启蒙,要输入的东西很多,所以我希望我选择的类型能让启蒙容易进入,看起来很直观……
有人可以帮忙吗?
c++ - 这可以通过静态类型来完成吗?
此方法尝试std::vector<?>
根据键 ( ) 选择 ( std::string
),其中?
是int
或float
:
该类的相关成员是:
这将无法编译,因为auto nodeMap
(= std::vector<?>
) 未初始化。但是为了初始化它,我必须在编译时知道它的类型。
也许我正在尝试的事情不能用静态类型来完成。有没有 C++ 方法来完成这个?
heap-memory - 我可以说在具有动态类型绑定的语言中,所有变量都分配在堆上吗?
我正在研究基于存储绑定的绑定过程和变量分类。所以,我面临四种变量:
- 静态变量:它们在执行之前(即编译期间)绑定到内存,并在整个执行过程中保持绑定。
- 堆栈动态变量:这些变量在编译时静态绑定到类型,但在代码执行到达声明之前它们不会绑定到内存位置。
- 显式堆动态变量:这些变量通过显式运行时、程序员指定的指令分配和释放。堆而不是堆栈用于提供所需的存储单元。
- 隐式堆动态变量:这些变量的所有属性,包括内存单元,在被赋值时都是绑定的。
我的问题是关于类型 2 和 4。在类型绑定是动态的编程语言中(Php、Ruby、Python,...),所有变量似乎都是类型 4。
这是真的吗?所有变量甚至局部变量都放在堆上?这是实现的事情还是不可能实现具有动态类型绑定的语言,其局部变量放在堆栈中而其他变量放在堆中?
java - 有没有很好的解释java语言的库?
在很多情况下,不需要显式编译类(即运行单元测试——我希望它们只是可运行的,不一定要编译和打包)。
我很好奇是否有任何解释java的库。
Scala(静态类型,在 jvm 上运行)内置了解释器,因此在我的理解中,它在技术上也应该适用于 java。