PowerShell是一种强类型语言吗?

powershell strong-typing

7397 观看

7回复

1851 作者的声誉

PowerShell绝对属于动态语言类别,但它会被认为是强类型的吗?

作者: Chris Sutton 的来源 发布者: 2008 年 9 月 22 日

回应 (7)


5

9083 作者的声誉

它可以是你需要的。

像这样:

[1] » [int]$x = 5
[2] » $x
5
[3] » $x = 'haha'
Cannot convert value "haha" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:3
+ $x  <<<< = 'haha'
[4] »

使用[type]表示法来指示您是否关心强类型变量。

编辑

正如edg指出的那样,这并不妨碍PowerShell在执行(5 +“5”)时将“5”解释为整数。我挖了一点,根据Windows PowerShell in Action中的 Bruce Payette ,PowerShell实际上是一种“类型混杂的语言”。所以,我猜,我的答案是“有点”。

作者: David Mohundro 发布者: 22.09.2008 03:48

1

19133 作者的声誉

从技术上讲,它是一种强类型语言。

您可以拒绝在shell中声明类型,使其行为类似于动态类型脚本语言,但它会将弱类型对象包装在“PsObject”类型的包装器中。通过使用“New-Object”语法声明对象,对象是强类型的,而不是包装对象。

$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
作者: Guy Starbuck 发布者: 22.09.2008 03:48

-1

3375 作者的声誉

我撤回了我之前的回答 - 引用如下。我应该说一些更细致入微的东西:

PowerShell具有强类型系统,具有强大的类型推断并且是动态类型的。

在我看来,这里有几个问题在起作用,因此要求更好地定义“强类型语言”含义的答案在他们处理问题时可能更为明智。

由于PowerShell跨越了许多边界,因此PowerShell所在的答案可能存在于由以下区域组成的维恩图中:

  • 静态与动态类型检查
  • 强打击与弱打字
  • 安全与不安全的打字
  • 显式与隐式声明和推理
  • 结构与主格类型系统

“PowerShell是一种强类型语言。

但是,它只要求您声明存在歧义的类型。

如果能够推断出类型,则不需要您指定类型。“

作者: Timothy Lee Russell 发布者: 22.09.2008 04:03

1

26046 作者的声誉

我认为您需要定义“强类型”的含义:

在计算机科学和计算机编程中,术语强类型用于描述编程语言指定对涉及具有不同数据类型的值的操作如何可以混合的一个或多个限制的情况。反义词是弱打字。然而,这些术语在计算的短暂历史中被赋予了如此广泛的含义,以至于在上下文中,通常很难知道单个作者在使用它们时的含义。

- 维基百科

作者: EBGreen 发布者: 22.09.2008 04:06

19

34708 作者的声誉

在terminlogy周围存在一定程度的混淆。本文解释了类型系统的有用分类。

PowerShell是动态的,隐式类型的:

> $x=100
> $x=dir

没有类型错误 - 变量可以在运行时更改其类型。这就像PythonPerlJavaScript,但不同于C ++JavaC#等。

然而:

> [int]$x = 100
> $x = dir
Cannot convert "scripts-2.5" to "System.Int32".

因此,如果需要,它还支持显式输入变量。但是,类型检查是在运行时而不是编译时完成的,因此它不是静态类型的。

我见过有人说PowerShell使用类型推断(因为你不必声明变量的类型),但我认为这是错误的。类型推断是在编译时进行类型检查的系统的一个特性(如varC#中的“ ”)。PowerShell仅在运行时检查类型,因此它可以检查实际值而不是推理。

但是,有一些自动类型转换正在进行:

> [int]$a = 1
> [string]$b = $a
> $b
1
> $b.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

所以有些类型会在运行中进行转换。大多数定义都会使PowerShell成为弱类型语言。它肯定比Python更弱(几乎?)从不转换类型。但可能并不像Perl那样弱,它会根据需要转换几乎任何东西。

作者: JacquesB 发布者: 22.09.2008 04:14

2

26046 作者的声誉

我认为将一个String添加到Int示例中可以进一步为讨论工厂提供更多元素。什么被认为是动态型铸造?其中一条评论中有人说在这种情况下:

4 + "4"

"4" 成为一个Int32。我根本不相信这种情况。我相信在将命令更改为的情况下会发生中间步骤:

4 + [System.Convert]::ToInt32("4")

请注意,这意味着"4"在整个过程中保持String。为了证明这一点,请考虑以下示例:

19# $foo = "4"
20# $foo.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


21# 4 + $foo
8
22# $foo.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
作者: EBGreen 发布者: 22.09.2008 04:27

1

11 作者的声誉

PowerShell是动态类型的,简单明了。它的创造者Bruce Payette就是这样描述的。

另外,如果有人参加过基础编程语言理论课,他们就会知道这一点。仅仅因为存在类型注释系统并不意味着它是强类型的。甚至类型带注释的变量在演员表中也会动态表现。任何允许您将字符串分配给变量并将其打印出来,然后将数字分配给同一变量并使用它进行计算的语言是动态类型的。

此外,PowerShell是动态范围的(如果有人知道这意味着什么)。

作者: The Old Hag 发布者: 14.04.2010 10:52
32x32