Существует ли язык, позволяющий изменять типы переменных? - PullRequest
2 голосов
/ 05 декабря 2011

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

Ответы [ 4 ]

1 голос
/ 05 декабря 2011

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

0 голосов
/ 13 декабря 2011

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

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

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

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

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

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

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

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

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

0 голосов
/ 05 декабря 2011

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

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

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
0 голосов
/ 05 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...