Scalar vs. primitive data type - are they the same thing?

后端 未结 7 528
深忆病人
深忆病人 2020-12-07 07:45

In various articles I have read, there are sometimes references to primitive data types and sometimes there are references to scalars.

My understanding of each is th

相关标签:
7条回答
  • 2020-12-07 07:54

    Every primitive is scalar, but not vice versa. DateTime is scalar, but not primitive.

    0 讨论(0)
  • 2020-12-07 08:03

    There's a lot of confusion and misuse of these terms. Often one is used to mean another. Here is what those terms actually mean.

    "Native" refers to types that are built into to the language, as opposed to being provided by a library (even a standard library), regardless of how they're implemented. Perl strings are part of the Perl language, so they are native in Perl. C provides string semantics over pointers to chars using a library, so pointer to char is native, but strings are not.

    "Atomic" refers to a type that can no longer be decomposed. It is the opposite of "composite". Composites can be decomposed into a combination of atomic values or other composites. Native integers and floating point numbers are atomic. Fractions, complex numbers, containers/collections, and strings are composite.

    "Scalar" -- and this is the one that confuses most people -- refers to values that can express scale (hence the name), such as size, volume, counts, etc. Integers, floating point numbers, and fractions are scalars. Complex numbers, booleans, and strings are NOT scalars. Something that is atomic is not necessarily scalar and something that is scalar is not necessarily atomic. Scalars can be native or provided by libraries.

    Some types have odd classifications. BigNumber types, usually implemented as an array of digits or integers, are scalars, but they're technically not atomic. They can appear to be atomic if the implementation is hidden and you can't access the internal components. But the components are only hidden, so the atomicity is an illusion. They're almost invariably provided in libraries, so they're not native, but they could be. In the Mathematica programming language, for example, big numbers are native and, since there's no way for a Mathematica program to decompose them into their building blocks, they're also atomic in that context, despite the fact that they're composites under the covers (where you're no longer in the world of the Mathematica language).

    These definitions are independent of the language being used.

    0 讨论(0)
  • 2020-12-07 08:05

    null type is the only thing that most realistically conforms to the definition of a "scalar type". Even the serialization of 'None' as 'N.' fitting into a 16bit word which is traditionally scalar -- or even a single bit which has multiple possible values -- isn't a "single data".

    0 讨论(0)
  • 2020-12-07 08:13

    Put simply, it would appear that a 'scalar' type refers to a single item, as opposed to a composite or collection. So scalars include both primitive values as well as things like an enum value.

    http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

    Perhaps the 'scalar' term may be a throwback to C:

    where scalars are primitive objects which contain a single value and are not composed of other C++ objects

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

    I'm curious about whether this refers to whether these items would have a value of 'scale'? - Such as counting numbers.

    0 讨论(0)
  • 2020-12-07 08:14

    In C, enumeration types, characters, and the various representations of integers form a more general type class called scalar types. Hence, the operations you can perform on values of any scalar type are the same as those for integers.

    0 讨论(0)
  • 2020-12-07 08:15

    I don't think they're interchangeable. They are frequently similar, but the difference does exist, and seems to mainly be in what they are contrasted with and what is relevant in context.

    Scalars are typically contrasted with compounds, such as arrays, maps, sets, structs, etc. A scalar is a "single" value - integer, boolean, perhaps a string - while a compound is made up of multiple scalars (and possibly references to other compounds). "Scalar" is used in contexts where the relevant distinction is between single/simple/atomic values and compound values.

    Primitive types, however, are contrasted with e.g. reference types, and are used when the relevant distinction is "Is this directly a value, or is it a reference to something that contains the real value?", as in Java's primitive types vs. references. I see this as a somewhat lower-level distinction than scalar/compound, but not quite.

    It really depends on context (and frequently what language family is being discussed). To take one, possibly pathological, example: strings. In C, a string is a compound (an array of characters), while in Perl, a string is a scalar. In Java, a string is an object (or reference type). In Python, everything is (conceptually) an object/reference type, including strings (and numbers).

    0 讨论(0)
提交回复
热议问题