Dart学习笔记2

Built-in types(内置的类型)

Dart 内置支持下面这些类型:

  • numbers
  • strings
  • booleans
  • lists (也被称之为 arrays)
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

Numbers(数值)

Dart 支持两种类型的数字:
int
整数值,其取值通常位于-2^{53}2^{53}之间。
double
64-bit (双精度) 浮点数,符合 IEEE 754 标准。
intdouble 都是 num 的子类。 num 类型定义了基本的操作符,例如 +, -, /, 和 *, 还定义了 abs()ceil()、和 floor() 等 函数。 (位操作符,例如 >> 定义在 int 类中。)

整数是不带小数点的数字。

  var x = 1;
  var hex = 0xDEADBEEF;
  var bigInt = 34653465233243244;

如果一个数带小数点,则其为 double。

var y = 1.1;
var exponents = 1.42e5;

下面是字符串和数字之间转换的方式:

void main() {
  // String -> int
  var one = int.parse('1');
  print("one => ${one == 1}");

  // String -> double
  var onePointOne = double.parse('1.1');
  print("onePointOne => ${onePointOne == 1.1}");

  // int -> String
  String oneAsString = 1.toString();
  print("oneAsString => ${oneAsString == '1'}");

  // double -> String
  String piAsString = 3.1415926.toStringAsFixed(2);
  print("piAsString => ${piAsString == '3.14'}");
}
num.png

整数类型支持传统的位移操作符,(<<, >>), AND (&), 和 OR (|) 。例如:

// 0011 << 1 == 0110
  print("(3 << 1) == 6 => ${(3 << 1) == 6}");
  // 0011 >> 1 == 0001
  print("(3 >> 1) == 1 => ${(3 >> 1) == 1}");
  // 0011 | 0100 == 0111
  print("(3 | 4)  == 7 => ${(3 | 4)  == 7}");

数字字面量为编译时常量。 很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。

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

Strings(字符串)

Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:

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}。如果表达式是一个比赛服,可以省略 {}。 如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。

  var s = 'love';
  print('i $s u' == 'i love '+'u');
  
  print('i ${s.toUpperCase()} u' == 'i LOVE u');

可以使用 + 操作符来把多个字符串链接为一个,也可以把多个字符串放到一起来实现同样的功能:

  var s = 'my youth ' 'my youth is yours,' "trippin'on skies sippin' waterfalls.";
  print(s);
string.jpg

使用三个单引号或者双引号也可以 创建多行字符串对象:

 var s1 = '''
  you can create 
  multi-line strings
  like this one.
  ''';
  print(s1);

  var s2 = """
  This is also a
  multi-line string.
  """;
  print(s2);
multi_line.jpg

字符串字面量是编译时常量, 带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = const [1, 2, 3];

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

Searching inside a string(在字符串内搜索)

可以在字符串内查找特定字符的位置,还可以判断字符串是否以特定字符串开始和结尾。 例如:

// Check whether a string contains another string.
assert('Never odd or even'.contains('odd'));

// Does a string start with another string?
assert('Never odd or even'.startsWith('Never'));

// Does a string end with another string?
assert('Never odd or even'.endsWith('even'));

// Find the location of a string inside a string.
assert('Never odd or even'.indexOf('odd') == 6);

Extracting data from a string(从字符串中提取数据)

可以从字符串中获取到单个的字符,单个字符可以是 String 也可以是 int 值。 准确来说,实际得到的是一个 UTF-16 code units; 对于码率比较大的字符,实际得到的是两个 code units,例如 treble clef 符号 (‘\u{1D11E}’) 。
还可以从字符串中提取一个子字符串,或者把字符串分割为 多个子字符串:

// Grab a substring.
assert('Never odd or even'.substring(6, 9) == 'odd');

// Split a string using a string pattern.
var parts = 'structured web apps'.split(' ');
assert(parts.length == 3);
assert(parts[0] == 'structured');

// Get a UTF-16 code unit (as a string) by index.
assert('Never odd or even'[0] == 'N');

// Use split() with an empty string parameter to get
// a list of all characters (as Strings); good for
// iterating.
for (var char in 'hello'.split('')) {
  print(char);
}

// Get all the UTF-16 code units in the string.
var codeUnitList = 'Never odd or even'.codeUnits.toList();
assert(codeUnitList[0] == 78);

Converting to uppercase or lowercase(大小写转换)

字符串大小写转换是非常 简单的:

// Convert to uppercase.
assert('structured web apps'.toUpperCase() ==
    'STRUCTURED WEB APPS');

// Convert to lowercase.
assert('STRUCTURED WEB APPS'.toLowerCase() ==
    'structured web apps');

Trimming and empty strings(裁剪和判断空字符串)

trim() 函数可以删除字符串前后的空白字符。使用 isEmpty 可以 判断字符串是否为空(长度为 0)。

// Trim a string.
assert('  hello  '.trim() == 'hello');

// Check whether a string is empty.
assert(''.isEmpty);

// Strings with only white space are not empty.
assert(!'  '.isEmpty);

Replacing part of a string(替换部分字符)

Strings 是不可变的对象,可以创建他们但是无法修改。 如果你仔细研究了 String API 文档,你会注意到并没有 函数可以修改字符串的状态。 例如,函数 replaceAll() 返回一个新的 String 对象而不是修改 旧的对象:

var greetingTemplate = 'Hello, NAME!';
var greeting = greetingTemplate
    .replaceAll(new RegExp('NAME'), 'Bob');

assert(greeting !=greetingTemplate); // greetingTemplate didn't change.

Building a string(创建字符串)

使用 StringBuffer 可以在代码中创建字符串。 只有当你调用 StringBuffer 的 toString() 函数的时候,才会创建一个 新的 String 对象。而 writeAll() 函数还有一个可选的参数来指定每个字符串的分隔符, 例如下面指定空格为分隔符:

var sb = new StringBuffer();
sb..write('Use a StringBuffer for ')
  ..writeAll(['efficient', 'string', 'creation'], ' ')
  ..write('.');

var fullString = sb.toString();

assert(fullString ==
    'Use a StringBuffer for efficient string creation.');

Regular expressions(正则表达式)

RegExp 类提供了 JavaScript 正则表达式同样的功能。 正则表达式可以高效率的搜索和匹配 字符串。

// Here's a regular expression for one or more digits.
var numbers = new RegExp(r'\d+');

var allCharacters = 'llamas live fifteen to twenty years';
var someDigits = 'llamas live 15 to 20 years';

// contains() can use a regular expression.
assert(!allCharacters.contains(numbers));
assert(someDigits.contains(numbers));

// Replace every match with another string.
var exedOut = someDigits.replaceAll(numbers, 'XX');
assert(exedOut == 'llamas live XX to XX years');

关于String的更多内容请前往: String API 文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容