Существует ли язык, позволяющий изменять типы переменных?

Я довольно разработчик младшего уровня (студент первого курса CS), и я узнал о различиях между статически типизированными и динамически типизированными языками. Поправьте меня, если я ошибаюсь, но я понимаю, что язык с динамической типизацией позволяет программисту инициализировать переменную без указания ее типа, а затем присвоить этой переменной тип позже в программе. Ради любопытства, существуют ли какие-либо языки, которые позволяют вам изменять тип / класс объекта, не инициализируя совершенно новую переменную?

4 ответа

Я думаю, что то, что вы ищете, это слабая печать. Обратите внимание, что слабая и сильная типизация - это не то же самое, что статическая и динамическая типизация.

Все зависит от того, что вы называете новой переменной. Например, в PHP:

<?php
$var = NULL; // $var is now of type null
$var = 1; // $var is now of type integer
?>

И так далее. Однако нет гарантии, что пространство, ранее использовавшееся для хранения значения NULL, теперь использовалось для хранения 1, так что вы могли бы сказать, что вы только что получили новую переменную с тем же именем.

Существует множество определений статической / динамической типизации и строгой / слабой типизации, поэтому сложно ответить на любой общий вопрос очень конкретно. При этом, определение (очень высокого уровня), которое я использую для них, имеет тенденцию достаточно хорошо передать общую идею (по крайней мере, я так думаю).

Статическая и динамическая типизация

Статически типизированный язык применяет типы к переменным. Переменная count может быть определено как целое число Он может содержать только целые значения.

Динамически типизированный язык применяет типы к значениям, но не к переменным. Значение 123 является целым числом, а "abc" является строкой, но переменная result может быть назначен одному или обоим в разные моменты времени.

Сильный против слабого набора текста

В строго типизированном языке значение имеет тип, и это только этот тип. Например, "123" строка где 123 является целым числом Вы не можете рассматривать строку как целое число и наоборот. Вы можете конвертировать между ними (то есть "123".toint() или тому подобное), но вы не можете просто рассматривать один тип как другой (то есть следующее не будет действительным: "123" + 456 == 579)

В слабо типизированном языке значение - это просто значение, и вы можете рассматривать его как различные типы в зависимости от его использования. Например, вы можете сказать "123" + 234 и получить полезный результат (357 или 123234 в зависимости от языка).

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

Что касается смежной темы, существует также явная и неявная типизация (программист определяет типы, а компилятор не определяет типы), что само по себе является действительно интересной темой.

Это зависит от того, как вы определяете типы, но JavasScript не имеет "классов" и позволяет вам легко изменять интерфейс на объект.

Я не знаю ни одного языка с сильной ОО-базой, который бы позволял вам делать что-то вроде:

typeof dog // Dog
dog.turnIntoCat()
typeof dog // Cat

Однако почти все языки OO поддерживают что-то вроде:

typeof dog // Dog
cat = dog.turnIntoCat()
typeof cat // Cat

И я думаю, что все динамически типизированные языки (по крайней мере, все, что я знаю) позволяют это:

typeof dog // Dog
dog = new Cat() 
typeof dog // Cat
Другие вопросы по тегам