写出gradle风格的groovy代码

我们先来看一段gradle中的代码:

buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.1.2'}
}allprojects {repositories {jcenter()}
}task clean(type: Delete) {delete rootProject.buildDir
}task wrapper(type: Wrapper) {gradleVersion = '2.10'
}

我第一次看gradle代码的时候是懵逼的,

这是哪门子语言,这到底是类似xml的标记语言还是类似java的语言?我不懂。不懂没关系,学了就懂了嘛。

大家现在已经知道了gradle使用groovy写的,所以他是我前面说的类似java的语言,但他是如何做到像上面这样炫酷吊炸天的写法呢?我们接下分析一下:

首先你在gradle中看不到;这是因为groovy支持不写;

println 'hello world'

下面我们看看这个:

dependencies {classpath 'com.android.tools.build:gradle:2.1.2'}

这个放在groovy中怎么解读呢?首先我们需要知道的是groovy中方法调用时可以省略()的!!!对你没有看错,正如上面的println 'hello world',ok,那不难理解上面的dependencies是一个方法名了,这里是一个方法的调用,而不是方法的定义。既然是方法的调用,那就可以知道{}实际上就是一个groovy的闭包类型的参数。而这个闭包里面又是个classpath的方法调用。

既然上面被我说通了,那就写个例子试试吧:

def dependencies(Closure cl){cl.call();
}def classpath(String path){println path
}dependencies {classpath 'com.android.tools.build:gradle:2.1.2'
}

Look,代码运行正常。

那么我们再来看这个:

task clean(type: Delete) {delete rootProject.buildDir
}

这个用上面的思路套进去看看呢?task是一个方法,没毛病。后面是两个参数?clean和一个闭包?这里就不对了,如果是两个参数,中间需要有,隔开,所以这里只有一个参数,就是clean。那这就是什么写法?这里我们又要了解groovy中的一个语法特性,

当一个方法的最后一个参数是闭包,可以将这个闭包写在()外面。

看例子:

def foo(String s,Closure cl){cl(s)
}//❶
foo('hello world'){println it
}foo 'hello world',{println it
}

方法的两种特殊写法都在这了,上面讲个写法就是❶处的写法。

所以把clean理解为一个参数是对的,接着再看clean(type: Delete)这个就简单了,groovy中的方法参数是支持命名参数的,这里用的就是命名参数,到这里都理顺了,我们还是写一个小例子模仿一下上面的写法:

def task(String taskName){println 'execute task ' + taskName
}def clean(Map type,Closure cl){type.type
}def delete(String path){}Delete = 'delete'task clean(type:Delete){delete "path"
}

这里我很勉强的写出了类似的代码,但gradle中的这些写法真的是我们理解的这样子吗?我们使用代码跟踪来看看.

首先看看dependencies是不是一个方法?

 void dependencies(Closure var1);

哈哈,还真是的,而且参数的确是一个闭包。

那在看看classpath是不是一个方法?

WTF,见鬼了,跟踪classpath的结果如下:

Dependency add(String configurationName, Object dependencyNotation);

竟然跟踪到了这个add方法,而且add方法还有两个参数,这是什么鬼?更诡异的是这个add方法属于DependencyHandler.java这个接口,对你没看错,是java接口。What the hell???

冷静一下。。。

我们分析一下,为什么会发生这种事情,这个难道已经超出我们认知的方位了?其实不然,虽然现在我也是啥都不知道,但我觉得这其中的原由一定能够在gradle中找到,所以就然我们正式开启学习gradle的大门吧。

转载于:https://www.cnblogs.com/zqlxtt/p/5741306.html

写出gradle风格的groovy代码相关推荐

  1. gradle风格的groovy代码

    我们先来看一段gradle中的代码: buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.b ...

  2. PyTorch最佳实践,怎样才能写出一手风格优美的代码

    [摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...

  3. PyTorch最佳实践,教你写出一手风格优美的代码

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 选自github 本文转自机器之心(nearhuman2014) PyTo ...

  4. pythonic风格_如何写出Pythonic风格的代码

    如何写出Pythonic风格的代码 索引 >>> my_numbers = (4, 5, 3, 9) >>> my_numbers[0] 4 >>> ...

  5. 【转载】如何写出低碳环保的 Android 代码

    如何写出低碳环保的 Android 代码 随着环境问题越来越严重,人们越来越重视低碳环保的生活方式.作为码农的我们自然也应该为环保做出应有的贡献.那么什么是低碳环保,简而言之就是就是低能量.低消耗.低 ...

  6. 你应该知道的7个写出更好的 Java 代码的技巧

    来源:SpringForAll社区 查看这些技巧和窍门可以帮助你写出更好的 Java 代码. 是的,你可以按照以下7个技巧和窍门编写出简短.整洁的 Java 代码.他们中的一些可能会让你感到惊讶,但是 ...

  7. 教你写出可读性高的Python代码

    如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性.确实,对于 Python 来说,其高可读性一直是这门语言设计的核心.一个不争的事实是,相对 ...

  8. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...

    原标题:涨姿势!这些小技巧让小白也可以写出更优雅的Python代码! 一.前言 我前两天回答了两个Python相关的问题,收到了很多赞,从答案被收藏的情况来看,确实对不少人都很有帮助,所以我也很开心. ...

  9. 如何写出三体的MATLAB程序-代码篇

    如何写出三体的MATLAB程序-代码篇 写在前面 在上文当中我们已经对三个物体之间的受力进行了分析,也说明了在时间 t t t下的加速度.速度和位移的计算方式. 本篇中将根据上一篇的公式来写出对应的代 ...

最新文章

  1. 大数据分析中国冬季重度雾霾的成因(二)
  2. 搭建一个日常好用的linux系统
  3. vc文件夹选择对话框
  4. 搜索引擎学习(一)初识Lucene
  5. AI:***一文读懂ML,DB/NLP/算法全有了……
  6. Ubuntu识别USB设备
  7. 使用JUnit的ExpectedException和@Rule测试自定义异常
  8. linux路由信息预览为空,route - 显示并设置Linux中静态路由表
  9. matlab简单分析频域滤波和时域滤波
  10. JVM性能优化, Part 5:Java的伸缩性
  11. 电子邮件.NET控件MailBee.NET Objects v11.1发布丨附下载
  12. C语言自动刷视频源码,使用C语言快速制作一个视频播放器,使用这个开源库就可以了...
  13. 如何创建您自己的MP3铃声
  14. matlab绘制均匀b样条曲线_[转载]用matlab实现B样条曲线
  15. 《惢客创业日记》2021.02.01(周一)饺子就酒
  16. 优化算法|MOAVOA:一种新的多目标人工秃鹰优化算法(Matlab代码实现)
  17. 基于redis实现抢红包功能(包括余额退回处理)
  18. 直方图都看不懂,怎么可能拍出好照片!
  19. 计算机图形学--实时光线追踪
  20. 名义初品微商系统开发,小程序开发

热门文章

  1. 从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果
  2. [python3.3]Python异步Socket编程【TCP】
  3. Android 系统使用USB OTG功能/打开USB Host API功能
  4. [react] 请说说什么是useRef?
  5. [react] 为什么建议Fragment包裹元素?它的简写是什么?
  6. 前端学习(3250):dom的diff算法
  7. 前端学习(3208):react中的事件绑定
  8. 前端学习(2709):重读vue电商网站29之左侧菜单栏
  9. 工作146:webstorm持续updating indices解决方法
  10. 前端学习(2611):vuex实现增加