【问题标题】:Are variable types permanent in Statically Typed Languages?静态类型语言中的变量类型是永久的吗?
【发布时间】:2017-12-05 00:00:38
【问题描述】:

我的理解是,静态类型语言在运行时之前会“检查”变量类型。

我认为这意味着 int 类型的 var 永远不能是字符串类型?这是否意味着变量类型不能在整个程序(在静态类型语言中)更改(在同一范围内)?

有人提到“可变阴影”,但我很确定这只适用于不同的范围。

var i = 'hi';
function foo() {
    var i = 1;
}

我对 var 阴影的理解是,全局范围内的 ifoo 函数范围内的 i 是不同的变量,因此它们的类型是永久且不相关的(在静态语言中,JS 不是)。对吗?

【问题讨论】:

  • “静态”不就是这个意思吗?如,不是“动态的”?

标签: variables types


【解决方案1】:

有人提到“可变阴影”,但我很确定这只适用于不同的范围。

这取决于您对“范围”的定义,例如,Rust 允许您所说的那种阴影,即使在单个块内:

fn main() {
    let a: str = "hello";
    let a: i32 = 3;
}

可以说影子变量的声明隐含地结束了前一个变量的范围。但要引用from the Rust book

请注意,隐藏名称不会改变或破坏它所绑定的值,并且该值将继续存在,直到超出范围,即使它不再可以通过任何方式访问。

【讨论】:

  • 所以将静态类型解释为具有“永久变量类型”的初学者是不正确的吗?这或多或少是真的,但也有例外……我正在尝试建立一个非常简单的静态与动态定义。
  • @JBallin - 考虑静态类型的更好方法是编译器在所有点上都知道表达式的类型。
  • 你能扩展一下吗?我的理解是,在运行时之前的某个时间点(我对实际发生类型检查的时间也感到困惑 - stackoverflow.com/questions/47644075/…)它检查变量类型,然后基于它优化编译代码。我错过了什么吗?
  • @jballin - 我说的是基本的编译成功/失败,而不是优化。
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多