Я не думаю, что они взаимозаменяемы. Они часто похожи, но разница действительно существует и, кажется, в основном заключается в том, с чем они контрастируют и что уместно в контексте.
Скаляры обычно противопоставляются составным элементам , таким как массивы, карты, множества, структуры и т. Д. Скаляр - это «единственное» значение - целое, логическое, возможно, строка, - в то время как составное соединение состоит из нескольких скаляров (и, возможно, ссылок на другие соединения). «Скалярный» используется в контекстах, где уместно различать одиночные / простые / атомарные значения и составные значения.
Примитивные типы , однако, противопоставляются, например, ссылочным типам , и используются, когда уместным различием является «Является ли это непосредственно значением или это ссылка на что-то, что содержит реальное значение?», Как в Java примитивных типов и ссылок , Я считаю это различием несколько более низкого уровня, чем скаляр / составное, но не совсем.
Это действительно зависит от контекста (и часто, о какой языковой семье идет речь). Возьмем один, возможно, патологический пример: струны. В C строка представляет собой составное соединение (массив символов), а в Perl строка - это скаляр. В Java строка - это объект (или ссылочный тип). В Python все (концептуально) является типом объекта / ссылки, включая строки (и числа).
Есть много путаницы и неправильного использования этих терминов. Часто одно используется для обозначения другого. Вот что на самом деле означают эти термины.
«Родные» относятся к типам, которые встроены в язык, а не предоставляются библиотекой (даже стандартной библиотекой), независимо от того, как они реализованы. Строки Perl являются частью языка Perl, поэтому они являются родными для Perl. C обеспечивает семантику строк по указателям на символы с использованием библиотеки, поэтому указатель на char является родным, а строки - нет.
«Атомарный» относится к типу, который больше не может быть разложен. Это противоположность «композитного» . Композиты можно разложить на комбинацию атомных значений или на другие композиты. Родные целые числа и числа с плавающей запятой являются атомарными. Дроби, комплексные числа, контейнеры / коллекции и строки составны.
«Скаляр» - и это то, что сбивает с толку большинство людей - относится к значениям, которые могут выражать масштаб (отсюда и название), например, размер, объем, количество и т. Д. Целые числа, числа с плавающей запятой и дроби являются скалярами. Комплексные числа, логические значения и строки НЕ являются скалярами. Что-то атомарное не обязательно скалярно, а что-то скалярное не обязательно атомарно. Скаляры могут быть собственными или предоставляться библиотеками.
Некоторые типы имеют странную классификацию. Типы BigNumber, обычно реализованные как массив цифр или целых чисел, являются скалярами, но технически не атомарны. Они могут казаться атомарными, если реализация скрыта и вы не можете получить доступ к внутренним компонентам. Но компоненты только скрыты, поэтому атомарность - иллюзия. Они почти всегда предоставляются в библиотеках, поэтому не являются родными, но могут быть. В языке программирования Mathematica, например, большие числа являются родными, и, поскольку программа Mathematica не может разложить их на их строительные блоки, они также атомарны в этом контексте, несмотря на то, что они являются составными частями в рамках обложки (где вы больше не находитесь в мире языка Mathematica).
Эти определения не зависят от используемого языка.
источник
Проще говоря, может показаться, что «скалярный» тип относится к одному элементу, а не к составу или коллекции. Таким образом, скаляры включают в себя как примитивные значения, так и такие вещи, как значение перечисления.
http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html
Возможно, термин "скаляр" может быть возвращением к C:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf
Мне любопытно, относится ли это к тому, будут ли эти предметы иметь значение «масштаб»? - Такие, как подсчет чисел.
источник
Мне нравится ответ Скотта Лангеберга, потому что он краток и подкреплен авторитетными ссылками. Я бы проголосовал за ответ Скотта, если бы мог.
Я полагаю, что «примитивный» тип данных можно рассматривать как первичный тип данных, так что вторичные типы данных являются производными от первичных типов данных. Получение происходит путем комбинирования, например структуры C ++. Структуру можно использовать для объединения типов данных (например, int и char) для получения вторичного типа данных. Тип данных, определяемый структурой, всегда является вторичным типом данных. Первичные типы данных не являются производными от чего-либо, скорее они заданы на языке программирования.
У меня есть параллель с примитивом, когда номенклатура означает первичный. Эта параллель - «регулярное выражение». Я думаю, что номенклатуру «регулярная» можно понимать как «регулирующую». Таким образом, у вас есть выражение, регулирующее поиск.
Скалярная этимология ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) означает подобие лестницы. Я думаю, что это связано с программированием: лестница имеет только одно измерение: сколько ступенек от конца лестницы. Скалярный тип данных имеет только одно измерение, поэтому представлен одним значением.
Я думаю, что в использовании примитив и скаляр взаимозаменяемы. Есть ли какой-нибудь пример примитива, который не является скаляром, или скаляра, который не является примитивом?
Хотя и взаимозаменяемый, примитив относится к типу данных, который является основным строительным блоком для других типов данных, а примитив не состоит из других типов данных.
Скаляр означает, что он имеет одно значение. Скаляр контрастирует с математическим вектором. Вектор не представлен одним значением, потому что (используя один вид вектора в качестве примера) одно значение необходимо для представления направления вектора, а другое значение необходимо для представления величины вектора.
Справочные ссылки: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type
источник
В C типы перечисления, символы и различные представления целых чисел образуют более общий класс типов, называемый скалярными типами. Следовательно, операции, которые вы можете выполнять со значениями любого скалярного типа, такие же, как и для целых чисел.
источник
нулевой тип - единственное, что наиболее реалистично соответствует определению «скалярного типа». Даже сериализация None как N. вставка в 16-битное слово, которое традиционно является скалярным, или даже в один бит, имеющий несколько возможных значений, не является «отдельными данными».
источник
Каждый примитив скалярен, но не наоборот. DateTime является скалярным, но не примитивным.
источник