8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
gradle 语法解析:
gradle的语法十分简洁,以至于看起来跟像是配置文件。
先看一个简单的android项目完整的gradle脚本:build.gradle1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38apply plugin: 'com.android.library'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
allprojects {
repositories {
mavenCentral()
}
}
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
defaultConfig {
applicationId "com.example.progressdemo"
minSdkVersion 14
targetSdkVersion 19
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile project(':library')
compile 'com.android.support:support-v4:20.0.0'
}
这是个很常见的配置。
这里buildscript后面的作用域内的代码是配置gradle运行所需要插件,repositories指明插件从jcenter仓库下载,dependencies指明这个项目编译依赖于com.android.tools.build插件。
原理
这个脚本看着很直观,意思也很清楚,但是,对应具体的语法看着还是有些摸不到规律。
解释这个语法需要先了解闭包。
groovy简介
这里简单介绍下groovy,具体得可以看官方文档。groovy是基于jvm的动态语言,语法和java也十分相似,而groovy更灵活。
groovy 中有很多的语法糖,这使得代码看着非常简洁。
首先要简化的是’;’和return
完整版本(与java完全一致):1
2
3String (){
return "test";
}
这个等价于:1
2
3String (){
'test'
}
然后是groovy方法调用functionTest.groovy1
2
3
4
5
6
7
8void functionA(String a){
print("hello" + a)
}
//调用
functionA("world")
//调用,简化写法。
functionA 'world'
上面写了2种方法调用,作用效果是一样的。groovy可以去掉方法的括号,用一个空格间隔开。这里是不是似曾相识呢,所以
classpath 'com.android.tools.build:gradle:1.2.3'
也可以写作
classpath('com.android.tools.build:gradle:1.2.3');
同样,多个参数,数组,闭包作为参数都可以这样操作:1
2
3
4
5
6functionB 'test', obj//多个参数
functionC ['key': value] //map作为参数
functionC key: value //map作为参数 简化写法
functionD {
println "i'm a closure"
}
回到开始的build.gradle脚本
可以看到很多地方用了这样的语法糖,让我们把它打回原形:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37apply([plugin: 'com.android.library'])
buildscript({
repositories({
jcenter();
);
});
dependencies({
classpath('com.android.tools.build:gradle:1.2.3');
});
allprojects({
repositories({mavenCentral();});
});
android({
compileSdkVersion(19);
buildToolsVersion('20.0.0');
defaultConfig({
applicationId("com.example.progressdemo");
minSdkVersion(14);
targetSdkVersion(19);
});
buildTypes({
release({
runProguard(false);
proguardFiles(getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt');
});
});
});
dependencies({
compile(project(':library'));//inline
compile('com.android.support:support-v4:20.0.0')
});
上面的2段代码是等价的。这样代码已经比较清楚了,build.gradle的内容也变成了groovy脚本,实际上,groovy脚本只是内置了class类的定义和main启动函数,它本质和我们平时写得java类没太大区别。当然,上面的代码看着更像javascript,这是因为里面写了很多的闭包。
####闭包(closure)
很多语言都有闭包,但是java没有,所以java的代码总是很罗嗦。闭包简单理解就是方法块,可以想象java中的静态方法块。
定义1
2
3
4
5
6
7def closureA = {
println "I'm a closure"
}
//带参数的
def closureB = { file ->
println file.getPath()
}
需要注意的是这里并没有定义file的类型,只要参数有path属性或者getPath()方法就可以了。
调用1
2closureA()
closureB(new File('/home/user/fileName'))
结合函数使用1
2
3
4
5
6
7
8
9
10
11void funtionE(closure){
closure()
///...
}
//调用:
funtionE(closureA)
//直接定义和使用闭包
funtionE {
println "I'm a closure"
}
到这里,我们就可以很容易地看懂gradle文件了;