Действительно ли PowerShell является языком со строгим контролем типов?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
14
задан Peter Mortensen 22 January 2016 в 12:53
поделиться

7 ответов

Существует определенное количество беспорядка вокруг terminlogy. Эта статья объясняет полезную таксономию систем типов.

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 использует вывод типа (потому что Вы не должны объявлять тип переменной), но я думаю, что это - неправильные слова. Вывод типа является функцией систем, которая делает проверку типа во время компиляции (как" var" в C#). PowerShell только проверяет типы во времени выполнения, таким образом, он может проверить фактическое значение, а не действительно заключает.

Однако существует некоторый объем автоматического продолжения преобразования типов:

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

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

Так приблизительно [1 114] типы преобразовываются на лету. Это будет по большинству определений делать PowerShell со слабым контролем типов язык. Это, конечно, более слабо, чем, например, Python который (почти?) никогда не преобразовывают типы на лету. Но вероятно не в слабом как Perl, который преобразует почти что-либо по мере необходимости.

22
ответ дан 1 December 2019 в 08:54
поделиться

Это может быть при необходимости в нем, чтобы быть.

Как так:

[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] »

Использование [тип] нотация, чтобы указать, заботитесь ли Вы о переменных, являющихся со строгим контролем типов.

РЕДАКТИРОВАНИЕ :

Как edg, на который указывают, это не препятствует тому, чтобы PowerShell интерпретировал "5" как целое число при выполнении (5 + "5"). Я вырыл немного больше, и по словам Bruce Payette в Windows PowerShell в Действии , PowerShell является на самом деле "неразборчивым типом языком". Так, я предполагаю, мой ответ является "видом".

5
ответ дан 1 December 2019 в 08:54
поделиться

Я думаю, смотря на добавление, что Строка к Международному примеру далее обеспечила бы больше зерна для фрезы обсуждения. Что считается динамическим преобразованием типа? Кто-то в одном из комментариев сказал что в этом случае:

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
2
ответ дан 1 December 2019 в 08:54
поделиться

Технически это - язык со строгим контролем типов.

можно отказаться объявлять типы в оболочке, позволив этому вести себя как динамический введенный язык сценариев, но это перенесет объекты со слабым контролем типов в обертку типа "PsObject". Путем объявления объектов с помощью "Ново-объектного" синтаксиса объекты со строгим контролем типов и не wrappered.

$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
1
ответ дан 1 December 2019 в 08:54
поделиться

Я думаю, что необходимо будет определить то, под чем Вы подразумеваете "Со строгим контролем типов":

В информатике и программировании, термин строгий контроль типов используется для описания тех ситуаций, где языки программирования указывают одно или несколько ограничений на то, как могут быть смешаны операции, включающие значения, имеющие различные типы данных. Антоним является слабым контролем типов. Однако этим условиям дали такое большое разнообразие значений по краткой истории вычислений этого, часто трудно знать из контекста, какое отдельное устройство записи имеет в виду при использовании их.

- Википедия

1
ответ дан 1 December 2019 в 08:54
поделиться

Я отрекаюсь от своего предыдущего ответа - заключенный в кавычки ниже. Я должен был сказать что-то более детальное как:

PowerShell имеет сильную систему типов с устойчивым выводом типа и с динамическим контролем типов.

мне кажется, что существует несколько проблем на работе здесь, таким образом, ответы, просящие лучшее определение того, что было предназначено "языком со строгим контролем типов", были, вероятно, более мудрыми в их подходе к вопросу.

, Так как PowerShell пересекает много границ, ответ туда, где PowerShell находится, вероятно, существует в схеме Венна, состоящей из следующих областей:

  • Статичный по сравнению с динамическим типом, проверяющим
  • Сильный по сравнению со слабым контролем типов
  • Безопасный по сравнению с небезопасным вводом
  • Явный по сравнению с неявным объявлением и выводом
  • Структурный по сравнению с номинативными системами типов

", PowerShell является языком со строгим контролем типов.

Однако это только требует, чтобы Вы объявили тип, где существует неоднозначность.

, Если это может вывести тип, это не требует, чтобы Вы указали его".

-1
ответ дан 1 December 2019 в 08:54
поделиться

Оболочка PowerShell динамически типизирована, проста и понятна. Так он описан его создателем Брюсом Пайеттом.

Кроме того, если бы кто-нибудь проходил курс базовой теории языков программирования, он бы это знал. Наличие системы аннотаций типов не означает, что она строго типизирована. Даже аннотированные переменные типа ведут себя динамически во время приведения. Любой язык, который позволяет назначить строку переменной и распечатать ее, а затем присвоить номер той же переменной и выполнять вычисления с ней, является динамически типизированным.

Кроме того, PowerShell имеет динамическую область видимости (если кто-нибудь знает, что это значит).

1
ответ дан 1 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: