面向Kotlin与Java开发者的Dart快速入门(一)变量

Dart入门教程 同时被 2 个专栏收录
15 篇文章 0 订阅
31 篇文章 1 订阅

在这里插入图片描述

变量/函数的作用域


与Kotlin一样,Dart可以在top-level进行变量或函数声明,main函数也在top-level声明,相对于Java作用域变得更广。

Dart中万物皆对象,所有的函数本质上都是Function类型的实例变量,所以函数可以像变量一样出现在top-level。


动态类型


Dart并非脚本语言,所以这里的“动态类型”是指Java的Object或者Kotlin的Any那样的不确定类型,可以在运行时强转成任何具体类型使用。Dart使用Object或者dynamic声明这种不确定类型。

dynamicObject非常相近,都可以动态进行类型检查、动态赋任何类型的值

/// 动态判断dynamic对象
bool convertToBool(dynamic arg) {
  if (arg is bool) return arg;
  if (arg is String) return arg == 'true';
  throw ArgumentError('Cannot convert $arg to a bool.');
}

他们的区别主要在与静态检查上:

  • dynamic:编译器不会对dynamic象进行静态检查,dynamic对象的任何操作在编译期都是合法的,但是运行时是否会出错需要开发者自己保证,所以建议大家在编程时不要不过度使用dynamic。
  • Object: 是Dart对象的基类,当你定义Object o = xxx ;时 ,编译器会将o作为一个Object对象看待,可以以调用otoString()hashCode()方法,因为Object 提供了这些方法,但是如果你尝试调用o.foo()时,静态类型检查会运行报错。

Object就是Java的Object,dynamic更像是Javascript的var。有趣的是Dart也有var关键字,但是Dart的var与Js的var不同,一旦赋值之后类型就不能再改变了,所以Dart的var更像是Kotlin的var

根据 Effective Dart 的建议:

  • 当实例代表“任何类型”时,使用Object
  • 当实例代表“某种待定类型时”时,使用dynamic,可能在某个时间点确定

访问控制


通过在函数、变量、类之前添加前导下划线(_)表示其私有性,类似于Java的private关键字,看起来像是借鉴了python的语法。

需要注意这里的私有不是指package的私有,而是library的私有。library内部即使添加了前导下划线也是可以互相访问的,例如一个Class内的_函数仍然可以被Class外部访问,library内部的访问控制需要使用linter关键字


类型推导


Dart像Kotlin一样,可以根据上线文推断出变量类型,而不必事先显式地进行类型声明

var hoge = "huga";
[1, 2, 3].forEach((x) => print(x*2));

Dart能够推断出hoge是String,x是int
主要注意,当指定类型声明时,类型需要像Java前置声明,而不是像Kotlin一样后置。


变量默认值


  • Dart中万物皆对象,都继承自Object,所以默认值都是null,包括intdouble
  • Java中存在非对象的基本型,所以默认值不是null
  • Kotlin的基本型虽然本质上也是对象,但是其默认值并不是null

使用assert进行判空

因为Dart的默认值null的存在,写代码时需要注意判空。Dart的assert()不会影响生产环境中代码的执行,它仅仅在测试环境中起作用,实际开发中可以活用assert进行判空。

Dart 2.7引入了NNBD (Non null by default),可以像Kotlin一样声明非空类型,将NPE扑灭在编译期。


NNBD


从 2.7 开始Dart像Kotlin一样允许声明非空类型

// int是non-null类型
final int a = 1;

// non-null类型赋值null会出现error
final int b = null;

// int?是nullable类型,可以赋值null
final int? c = null;

我们在命名参数前加required关键字,表示此参数一定能取到值

// arg1 :non-null的String类型
void doSomething({required String arg1}) { ... }

// 调用函数时,required的参数不可省略
doSomething(arg1: "hoge");

可以在flutter项目根目录创建一个analysis_options.yaml文件,然后通过添加以下内容,对空安全进行静态检查

analyzer:
  enable-experiment:     
    - non-nullable

不可变类型与常量


final

类似于Java的final或者Kotlin的val,使用final声明的变量是不可变的,不能被二次赋值。

final hoge = "fuga";

虽然与Java的用法相近,但是细节上更严格:

  • Java的final只规定不能二次赋值,但是没有规定初始化的时机
  • Dart的final要求必须在声明的同时或者在初始化列表中完成初始化。

Class的final成员可以在初始化列表中初始化:

mport 'dart:math';

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point(x, y)
      : x = x, //初始化列表中对final成员初始化
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}

main() {
  var p = new Point(2, 3);
  print(p.distanceFromOrigin);
}

const

  • const是编译期必须确定的常量,相当于Kotlin的const val x
  • final是可以在运行时在进行第一次初始化:
final x = new DateTime.now(); // 正确
const x = new DateTime.now(); // 错误

final y = sin(90); // 正确
const y = sin(90); // 错误

另外,const还可以进行字面值的list创建:

var hoge = const [1, 2, 3];

此时hoge是一个immutable的list,内部的item不能变更



返回首页:Dart入门教程

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率爬虫,如何写出灵活性高可扩展爬虫都是项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为个其他行业开发者,比如app开发,web开发,学习爬虫能让你加强对技术认知,能够开发出更加安全软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 个完整爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来数据进行过滤,提取我们想要数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进进行讲解,带领学生完整掌握每个步骤技术。另外,因为爬虫多样性,在爬取过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶知识点我们能应付大量反爬网站,而Scrapy框架作为个专业爬虫框架,使用他可以快速提高我们编写爬虫程序效率和速度。另外如果台机器不能满足你需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值