PowerShell是一种强类型的语言吗?
PowerShell绝对属于动态语言范畴,但是会被认为是强类型的吗?
解决方案
如果我们需要它可以是。
像这样:
[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实际上是一种"类型混杂语言"。因此,我想我的答案是"有点"。
从技术上讲,它是一种强类型语言。
我们可以拒绝在Shell中声明类型,从而使其行为类似于动态类型的脚本语言,但是它将弱类型的对象包装在" PsObject"类型的包装器中。通过使用" New-Object"语法声明对象,可以对对象进行强类型化并且不对其进行包装。
$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
我撤回了先前的答案-在下面引用。我应该说些更细微的话:
PowerShell具有强大的类型系统,具有可靠的类型推断功能,并且可以动态键入。
在我看来,这里有几个问题在起作用,因此,要求对"强类型语言"的含义进行更好定义的答案可能更明智。
由于PowerShell跨越许多边界,因此在以下几个方面组成的维恩图中可能存在关于PowerShell所在位置的答案:
- 静态与动态类型检查
- 强打字与弱打字
- 安全与不安全的打字
- 显式与隐式声明与推断
- 结构型与名义型系统
"PowerShell is a strongly typed language. However, it only requires you to declare the type where there is ambiguity. If it is able to infer a type, it does not require you to specify it."
我认为我们需要定义"强类型"的含义:
In computer science and computer programming, the term strong typing is used to describe those situations where programming languages specify one or more restrictions on how operations involving values having different datatypes can be intermixed. The antonym is weak typing. However, these terms have been given such a wide variety of meanings over the short history of computing that it is often difficult to know, out of context, what an individual writer means when using them.
-维基百科
围绕该术语存在一定程度的混乱。本文介绍了类型系统的有用分类法。
PowerShell是动态的隐式类型:
> $x=100 > $x=dir
没有类型错误的变量可以在运行时更改其类型。这就像Python,Perl,JavaScript,但不同于C ++,Java,C#等。
然而:
> [int]$x = 100 > $x = dir Cannot convert "scripts-2.5" to "System.Int32".
因此,如果需要,它还支持显式键入变量。但是,类型检查是在运行时而不是编译时完成的,因此它不是静态类型的。
我已经看到有人说PowerShell使用类型推断(因为我们不必声明变量的类型),但是我认为这是错误的说法。类型推断是系统在编译时进行类型检查的功能(例如C#中的"`var")。 PowerShell仅在运行时检查类型,因此它可以检查实际值,而不进行推断。
但是,正在进行一些自动类型转换:
> [int]$a = 1 > [string]$b = $a > $b 1 > $b.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
因此,某些类型会即时转换。根据大多数定义,这将使PowerShell成为弱类型语言。它肯定比例如Python(几乎?)永远不会即时转换类型。但是可能不如Perl弱,它将根据需要转换几乎所有内容。
我认为进一步研究将字符串添加到Int示例中将为讨论提供更多依据。什么是动态类型转换?其中一项评论中的某人说,在这种情况下:
4 +" 4"
" 4"变成一个Int32. 我完全不这么认为。我相信,取而代之的是将命令更改为以下步骤:
4 + [System.Convert] :: ToInt32(" 4")
请注意,这意味着" 4"在整个过程中都将保留字符串。为了说明这一点,请考虑以下示例:
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
PowerShell是动态键入的,简单明了的。它的创建者Bruce Payette对此进行了描述。
此外,如果有人上过基础编程语言理论课,他们会知道的。仅仅因为有一个类型注释系统并不意味着它是强类型的。甚至带有类型注释的变量在强制转换过程中也会动态地表现。动态地键入允许我们将字符串分配给变量并打印出来,然后将数字分配给相同变量并进行计算的任何语言。
此外,PowerShell是动态作用域的(如果这里的任何人知道这意味着什么)。