Dart In Action -Dar的基本數(shù)據(jù)類型(一)

寫(xiě)在前面

本文基本上是將dart官網(wǎng)部分內(nèi)容進(jìn)行翻譯丘跌,沒(méi)興趣的請(qǐng)出門(mén)左轉(zhuǎn)至Dart的官網(wǎng),有興趣的同志請(qǐng)繼續(xù)閱讀本文初烘。
Flutter教程在這里

數(shù)字

Dart的數(shù)字一共分為2類:

  • int
    整型不大于64位罢缸,具體取決于平臺(tái)。 在Dart VM上颊艳,值可以是-263到263 - 1.編譯為JavaScript的Dart使用JavaScript 數(shù)字茅特,允許從-253到253 - 1的值。
  • double
    64位(雙精度)浮點(diǎn)數(shù)棋枕,由IEEE 754標(biāo)準(zhǔn)規(guī)定白修。

int和double都是num的子類型。 num類型包括基本運(yùn)算符重斑,如+兵睛, - ,/和*,也是你可以找到abs()祖很,ceil()floor()以及其他方法的地方。 (按位運(yùn)算符,如>>,在int類中有定義趟脂。)如果num及其子類沒(méi)有您要想要內(nèi)容,那dart:math庫(kù)可能有您想要的累澡。

整數(shù)是沒(méi)有小數(shù)點(diǎn)的數(shù)字哼蛆。 以下是定義整數(shù)文字的一些示例:

int x = 1;
int hex = 0xDEADBEEF;

如果數(shù)字包含小數(shù),則為雙精度數(shù)。 以下是定義雙精度數(shù)字的一些示例:

double y = 1.1;
double exponents = 1.42e5;

以下是將字符串轉(zhuǎn)換為數(shù)字的方法名挥,反之亦然:

// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

int類型指定傳統(tǒng)的按位移位(<<救湖,>>),AND(&)和OR(|)運(yùn)算符陡舅。 例如:

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

文字?jǐn)?shù)字是編譯時(shí)常量。 許多算術(shù)表達(dá)式也是編譯時(shí)常量颅眶,只要它們的操作數(shù)是編譯為數(shù)字的編譯時(shí)常量蜈出。(注:這是說(shuō)如果一個(gè)表達(dá)式涉及到的變量也是編譯時(shí)常量,那么表達(dá)式也是編譯時(shí)常量涛酗。)

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

字符串

Dart字符串是一系列UTF-16代碼單元铡原。 您可以使用單引號(hào)或雙引號(hào)來(lái)創(chuàng)建字符串:

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

您可以使用${expression}將表達(dá)式的值放在字符串中。 如果表達(dá)式是標(biāo)識(shí)符煤杀,則可以跳過(guò){}眷蜈。 要獲取對(duì)應(yīng)于對(duì)象的字符串,Dart調(diào)用對(duì)象的toString()方法沈自。

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, ' +
        'which is very handy.');
assert('That deserves all caps. ' +
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. ' +
        'STRING INTERPOLATION is very handy!');

注意:==運(yùn)算符測(cè)試兩個(gè)對(duì)象是否相同酌儒。 如果兩個(gè)字符串包含相同的代碼單元序列,則它們是等效的枯途。

您可以使用相鄰的字符串文字或+運(yùn)算符來(lái)連接字符串:

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
    'line breaks.');

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

創(chuàng)建多行字符串的另一種方法:使用帶有單引號(hào)或雙引號(hào)的三重引號(hào):

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

您可以通過(guò)在其前面加上r來(lái)創(chuàng)建“raw”字符串:

var s = r'In a raw string, not even \n gets special treatment.';

有關(guān)如何在字符串中表示Unicode字符的詳細(xì)信息忌怎,請(qǐng)參閱Runes。

文字字符串是編譯時(shí)常量酪夷,只要任何插值表達(dá)式是一個(gè)編譯時(shí)常量榴啸,其值為null或數(shù)值,字符串或布爾值晚岭。

// 這些在const String可以使用.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// 這些在const String中不能使用.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

有關(guān)使用字符串的更多信息鸥印,請(qǐng)參閱字符串和正則表達(dá)式

布爾值

為了表示布爾值,Dart有一個(gè)名為bool的類型库说。 只有兩個(gè)對(duì)象具有bool類型: truefalse狂鞋,它們都是編譯時(shí)常量。

Dart的類型安全意味著您不能使用if(nonbooleanValue)assert(nonbooleanValue)等代碼潜的。 相反骚揍,明確檢查值,如下所示:

// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);

// Check for null.
var unicorn;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

列表

也許幾乎每種編程語(yǔ)言中最常見(jiàn)的集合是數(shù)組或有序的對(duì)象組啰挪。 在Dart中信不,數(shù)組是List 對(duì)象,因此大多數(shù)人只是將它們稱為列表亡呵。

Dart列表文字看起來(lái)像JavaScript數(shù)組文字抽活。 這是一個(gè)簡(jiǎn)單的Dart List:

var list = [1, 2, 3];

注意:分析器推斷列表的類型為L(zhǎng)ist <int>。 如果嘗試將非整數(shù)對(duì)象添加到此列表政己,則分析器或運(yùn)行時(shí)會(huì)引發(fā)錯(cuò)誤酌壕。 有關(guān)更多信息,請(qǐng)閱讀類型推斷歇由。
List使用從零開(kāi)始的索引卵牍,其中0是第一個(gè)元素的索引,list.length - 1是最后一個(gè)元素的索引沦泌。 您可以像在JavaScript中一樣獲取列表的長(zhǎng)度并引用列表元素:

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

要?jiǎng)?chuàng)建一個(gè)編譯時(shí)常量的列表糊昙,請(qǐng)?jiān)诹斜砦淖种疤砑?code>const:

var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注釋會(huì)導(dǎo)致錯(cuò)誤。

List類型有許多方便的方法來(lái)操作列表谢谦。 有關(guān)列表的更多信息释牺,請(qǐng)參閱泛型集合

映射

通常回挽,映射是一個(gè)有鍵和值的對(duì)象没咙。 鍵和值都可以是任何類型的對(duì)象。 每個(gè)鍵只出現(xiàn)一次千劈,但您可以多次使用相同的值祭刚。 Dart的Map支持由映射文字和Map

這里有幾個(gè)簡(jiǎn)單的Dart映射墙牌,使用map文字創(chuàng)建:

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

注意:分析器推斷gifts的類型為Map <String涡驮,String>,而nobleGases的類型為Map <int喜滨,String>捉捅。 如果您嘗試將錯(cuò)誤類型的值添加到任一映射,則分析器或運(yùn)行時(shí)會(huì)引發(fā)錯(cuò)誤虽风。 有關(guān)更多信息棒口,請(qǐng)閱讀類型推斷寄月。

您可以使用Map構(gòu)造函數(shù)創(chuàng)建相同的對(duì)象:

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

注意:您可能希望看到new Map() 而不僅僅是Map()。 從Dart 2開(kāi)始无牵,new關(guān)鍵字是可選的剥懒。 有關(guān)詳細(xì)信息,請(qǐng)參閱使用構(gòu)造函數(shù)合敦。
像在JavaScript中一樣,將新的鍵值對(duì)添加到現(xiàn)有Map:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // 新增一個(gè)鍵值對(duì)

以與在JavaScript中相同的方式從Map中檢索值:

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

如果您在Map中查找一個(gè)不存的鍵验游,則會(huì)返回null:

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

使用.length獲取Map中鍵值對(duì)的數(shù)量:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

要?jiǎng)?chuàng)建一個(gè)為編譯時(shí)常量的Map充岛,請(qǐng)?jiān)趍ap之前添加const

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // 取消注釋會(huì)導(dǎo)致錯(cuò)誤。

有關(guān)Map的更多信息耕蝉,請(qǐng)參閱泛型映射崔梗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垒在,隨后出現(xiàn)的幾起案子蒜魄,更是在濱河造成了極大的恐慌,老刑警劉巖场躯,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谈为,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡踢关,警方通過(guò)查閱死者的電腦和手機(jī)伞鲫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)签舞,“玉大人秕脓,你說(shuō)我怎么就攤上這事∪宕睿” “怎么了吠架?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搂鲫。 經(jīng)常有香客問(wèn)我傍药,道長(zhǎng),這世上最難降的妖魔是什么默穴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任怔檩,我火速辦了婚禮,結(jié)果婚禮上蓄诽,老公的妹妹穿的比我還像新娘薛训。我一直安慰自己,他們只是感情好仑氛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布乙埃。 她就那樣靜靜地躺著闸英,像睡著了一般。 火紅的嫁衣襯著肌膚如雪介袜。 梳的紋絲不亂的頭發(fā)上甫何,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音遇伞,去河邊找鬼辙喂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸠珠,可吹牛的內(nèi)容都是我干的巍耗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渐排,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炬太!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驯耻,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亲族,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后可缚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霎迫,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年帘靡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了女气。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡测柠,死狀恐怖炼鞠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轰胁,我是刑警寧澤谒主,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赃阀,受9級(jí)特大地震影響霎肯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榛斯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一观游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驮俗,春花似錦懂缕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聋丝。三九已至,卻和暖如春工碾,著一層夾襖步出監(jiān)牢的瞬間弱睦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工渊额, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留况木,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓旬迹,卻偏偏與公主長(zhǎng)得像焦读,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舱权,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容