Ruby中任务构建工具rake的入门
不同的rake文件当中不要定义重名的方法,不然没法调用
参考:http://www.jb51.net/article/81476.htm
Rake简介
Rake的意思是Ruby Make,一个用ruby开发的代码构建工具.
但是,为什么Ruby需要Rake?
按理说Ruby代码无需编译,应该不需要Rake才对呀?原来,Rake另有妙用,即把Rake当做一个任务管理工具来使用...这样做有两个好处:
1.以任务的方式创建和运行脚本
当然,你可以用脚本来创建每一个你希望自动运行的任务.但是,对于大型的应用来说,你几乎总是需要为数据库迁移(比如Rails中db:migrate任务)、清空缓存、或者代码维护等等编写脚本.对于每一项任务,你可能都需要写若干脚本,这会让你的管理变得复杂.那么,把它们用任务的方式整理到一起,会让管理变得轻松很多.
2.追踪和管理任务之间的依赖
Rake还提供了轻松管理任务之间依赖的方式.比如,"migrate"任务和"schema:dump"任务都依赖于 "connect_to_database"任务,那么在"migrate"任务调用之前,"connect_to_database"任务都会被执行.
下面入正题吧,即如何用Rake编写一个任务脚本..
顺序执行
在Rake中定义任务后,可以指定任务的执行顺序,例如,每天早晨起床后的例行公事:
1. 关闭闹钟
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的几项事物,在Rakefile中这样描述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
task :turn_off_alarm do puts "Turned off alarm. Would have liked 5 more minutes, though." end task :groom_myself do puts "Brushed teeth." puts "Showered." puts "Shaved." end task :make_coffee do cups = ENV [ "COFFEE_CUPS" ] || 2 puts "Made #{cups} cups of coffee. Shakes are gone." end task :walk_dog do puts "Dog walked." end task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do puts "Ready for the day!" end |
通过rake ready_for_the_day来执行任务,然后你就可以看到,所有的task都在按照你预定的顺序在执行。
1
2
3
4
5
6
7
|
Turned off alarm. Would have liked 5 more minutes, though. Brushed teeth. Showered. Shaved. Made 5 cups of coffee. Shakes are gone. Dog walked. Ready for the day! |
此外还可以用过rake make_coffee COFFEE_CUPS=5这样在命令中给变量赋值。
命名空间
上面那样定义任务没有问题,但如果你需要另外定义些事物,比如工作相关的,交通相关的,这时候所有的任务混杂到一起显然就不合适了,毕竟上面那些任务只是我们起床的例行事物,与其它无关。
通过namespace可以帮助我们定义出Rails中类似rake db:migrate的任务,描画出事物间清晰的边界,将上面的任务包括在namespace的一个代码块中,如下
1
2
3
4
|
namespace :morning do task :turn_of_alarm .... end |
这一次我们的调用命令就需要稍微做出些许变化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是不是跟rails中的rake任务调用方式很像呢?
默认Task
有了上面那些设置,如果我们忘记或者不想写详细的任务名称,直接执行rake会有什么效果呢,结果是rake aborted!,任务被中断的报错。既然有这样的可能性,我们就需要消除这些隐患,通过设置default默认任务就可以做到,如下:
1
|
task :default => 'morning:turn_off_alarm' |
当你直接执行rake命令时,会执行默认操作,帮我们关闭闹钟。
描述你的Task
当任务渐渐变多以后,管理问题就暴露出来了,除了命名空间以外,我们还需要文档类的支持,帮助我们梳理任务并显示的告诉我们每个任务的目的和功能,这时你可以试一试用desc描述任务。
1
2
3
4
5
6
7
|
... desc "Make coffee" task :make_coffee do cups = ENV [ "COFFEE_CUPS" ] || 2 puts "Made #{cups} cups of coffee. Shakes are gone." end ... |
上面的描述不仅可以在文档中查看,同时使用rake -T也能清洗的了解到每个任务是做什么的。rake -T的输出结果是按照字母顺序排的序。
1
|
rake morning :make_coffee # Make coffee |
调取Task
Rake还允许在不同任务之间互相调用,例如下面的代码,你想在下午也来杯咖啡,不用重复定义,直接使用上午的泡法,来一杯即可。
1
2
3
4
5
6
|
namespace :afternoon do task :make_coffee do Rake::Task[ 'morning:make_coffee' ].invoke puts "Ready for the rest of the day!" end end |
Rake脚本编写
先来个简单的例子,如下:
假设你是一个火星成员,老版本那些,即如燕儿虎跑之类的,在周末你打算去车车那边打火锅,然后集体PC去.对应这个情况,你需要为自己制定三个任务:搭车找车车、烤鱼和网吧PC.用vim创建创建一个名叫rakefile的文件(备注:Rake会在当前路径下寻找名叫Rakefile、rakefile、RakeFile.rb和rakefile.rb的rake文件),并键入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
desc "任务1 -- 搭车去车车那里" #这据说是个苦差,因为太远了 task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end |
打开命令行工具,进入这个文件所在目录,然后运行下面的命令,大致应该类似如下结果:
1
2
3
4
5
6
7
8
9
10
11
|
D:\work>rake busboy (in D:/work) 发现挫男 D:\work>rake bitchfish (in D:/work) 老板,先烤九斤鱼 D:\work\ruby_works\ruby_book>rake laundry (in D:/work) 我选中路 |
(备注:文字部分是没啥逻辑的,纯粹娱乐下...)
分析:
相信看完上面那段东东,你已经知道怎么搞了...现在介绍些基础知识,方便加深理解.从上面的代码可以知道,此文件一共定义了3个任务,desc是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.
1
2
3
4
5
|
D:\work>rake - -tasks (in D:/work) rake bitchfish #任务2 -- 烤鱼 rake busboy #任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了) rake pc 任务3 -- 网吧PC |
task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block,本例中只是简单输出你所要做的工作.需要注意的是代码
1
|
puts "发现挫男" |
完全是一个普通的Ruby语句,puts是Ruby中进行输出的一般性方法,可以看出,Rake任务可以完全使用Ruby的能力,这使得它非常强大.
go..go..go..go..
接下来加入依赖关系:
很显然,在我们定义的任务中,"烤鱼"是依赖于"搭车去车车那里"的(其它地方有没烤鱼吃不知道,反正地点就定在那了).那么,我们需要在我们的任务定义中加入这个依赖关系,修改后的文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
desc "任务1 -- 搭车去车车那里" task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish => :busboy do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end |
再次运行烤鱼任务,你会得到如下结果:
1
2
3
4
|
D:\work>rake bitchfish (in D:/work) 发现挫男 老板,先烤九斤鱼 |
加入命名空间:
跟任何编程语言类似,当你的rake文件很多时,当你有很多任务的时候,你需要关注它们的命名冲突问题,命名空间(namespace)就是一个自然的解决方案.你可以为上面的三个任务定义一个叫做dan的命名空间.
1
2
3
4
5
6
7
|
namespace :dan do desc "任务1 -- 搭车去车车那里" task :busboy do puts "发现挫男" end …… end |
再次运行rake --tasks,你会得到如下的结果:
1
2
3
4
5
|
D:\work >rake --tasks ( in D: /work ) rake dan:bitchfish # 任务2 -- 烤鱼 rake dan:pc # 任务3 -- 网吧PC rake dan:busboy # 任务1 -- 搭车去车车那里 |
你现在需要使用rake dan:bitchfish才能启动烤鱼这个任务了.
(BTW,你可以在你的rakefile中使用多个命名空间,对任务进行分类.)
了解了上面两个知识点后,我们来了解下两个具体实例:
1.在一个任务中调用另外一个任务
当任务众多的时候,你很可能需要在一个任务中调用另外一个任务,假设我们把今天所有要做的工作定义为一个任务:today.在这个任务中,有两个任务需要被调用,一个是烤鱼,一个是网吧PC.当然,由于烤鱼依赖于搭车去车车那里,我们还是需要搭车去车车那里的.在文件的顶部定义一个today的任务:
1
2
3
4
5
6
7
8
9
|
desc "今天的任务" task :today do Rake::Task[ "dan:bitchfish" ].invoke Rake::Task[ "dan:pc" ].invoke end namespace :dan do …… end |
可以看出,调用其它任务的方式很简单,只需要调用
1
|
Rake::Task[ "task_name" ].invoke |
方法就可以了.在命令行中启动rake today,可以得到:
1
2
3
4
5
|
D:\work >rake today ( in D: /work ) 发现挫男 老板,先烤九斤鱼 我选中路 |
2.默认任务:
可以为Rake增加一个默认任务,这样可以简单地用Rake命令来触发这个默认任务,在上面的rakefile中,我们可以用如下方式把"today"任务作为默认任务.
1
|
task :default => [ :today ] |
然后调用直接在命令行中调用rake,可以得到跟调用rake today同样的输出结果.
这就是我们简单的一个Rake任务定义,下面是完整的修改后的rakefile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
task :default => [ :today ] desc "今天的任务" task :today do Rake::Task[ "dan:bitchfish" ].invoke Rake::Task[ "dan:pc" ].invoke end namesoace :dan do desc "任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了)" task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end end |
看完上面两个例子,估计rake任务就算全部了解了...其它都是些代码枪花罢了..多耍便是..
Rake简介
Rake的意思是Ruby Make,一个用ruby开发的代码构建工具.
但是,为什么Ruby需要Rake?
按理说Ruby代码无需编译,应该不需要Rake才对呀?原来,Rake另有妙用,即把Rake当做一个任务管理工具来使用...这样做有两个好处:
1.以任务的方式创建和运行脚本
当然,你可以用脚本来创建每一个你希望自动运行的任务.但是,对于大型的应用来说,你几乎总是需要为数据库迁移(比如Rails中db:migrate任务)、清空缓存、或者代码维护等等编写脚本.对于每一项任务,你可能都需要写若干脚本,这会让你的管理变得复杂.那么,把它们用任务的方式整理到一起,会让管理变得轻松很多.
2.追踪和管理任务之间的依赖
Rake还提供了轻松管理任务之间依赖的方式.比如,"migrate"任务和"schema:dump"任务都依赖于 "connect_to_database"任务,那么在"migrate"任务调用之前,"connect_to_database"任务都会被执行.
下面入正题吧,即如何用Rake编写一个任务脚本..
顺序执行
在Rake中定义任务后,可以指定任务的执行顺序,例如,每天早晨起床后的例行公事:
1. 关闭闹钟
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的几项事物,在Rakefile中这样描述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
task :turn_off_alarm do puts "Turned off alarm. Would have liked 5 more minutes, though." end task :groom_myself do puts "Brushed teeth." puts "Showered." puts "Shaved." end task :make_coffee do cups = ENV [ "COFFEE_CUPS" ] || 2 puts "Made #{cups} cups of coffee. Shakes are gone." end task :walk_dog do puts "Dog walked." end task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do puts "Ready for the day!" end |
通过rake ready_for_the_day来执行任务,然后你就可以看到,所有的task都在按照你预定的顺序在执行。
1
2
3
4
5
6
7
|
Turned off alarm. Would have liked 5 more minutes, though. Brushed teeth. Showered. Shaved. Made 5 cups of coffee. Shakes are gone. Dog walked. Ready for the day! |
此外还可以用过rake make_coffee COFFEE_CUPS=5这样在命令中给变量赋值。
命名空间
上面那样定义任务没有问题,但如果你需要另外定义些事物,比如工作相关的,交通相关的,这时候所有的任务混杂到一起显然就不合适了,毕竟上面那些任务只是我们起床的例行事物,与其它无关。
通过namespace可以帮助我们定义出Rails中类似rake db:migrate的任务,描画出事物间清晰的边界,将上面的任务包括在namespace的一个代码块中,如下
1
2
3
4
|
namespace :morning do task :turn_of_alarm .... end |
这一次我们的调用命令就需要稍微做出些许变化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是不是跟rails中的rake任务调用方式很像呢?
默认Task
有了上面那些设置,如果我们忘记或者不想写详细的任务名称,直接执行rake会有什么效果呢,结果是rake aborted!,任务被中断的报错。既然有这样的可能性,我们就需要消除这些隐患,通过设置default默认任务就可以做到,如下:
1
|
task :default => 'morning:turn_off_alarm' |
当你直接执行rake命令时,会执行默认操作,帮我们关闭闹钟。
描述你的Task
当任务渐渐变多以后,管理问题就暴露出来了,除了命名空间以外,我们还需要文档类的支持,帮助我们梳理任务并显示的告诉我们每个任务的目的和功能,这时你可以试一试用desc描述任务。
1
2
3
4
5
6
7
|
... desc "Make coffee" task :make_coffee do cups = ENV [ "COFFEE_CUPS" ] || 2 puts "Made #{cups} cups of coffee. Shakes are gone." end ... |
上面的描述不仅可以在文档中查看,同时使用rake -T也能清洗的了解到每个任务是做什么的。rake -T的输出结果是按照字母顺序排的序。
1
|
rake morning :make_coffee # Make coffee |
调取Task
Rake还允许在不同任务之间互相调用,例如下面的代码,你想在下午也来杯咖啡,不用重复定义,直接使用上午的泡法,来一杯即可。
1
2
3
4
5
6
|
namespace :afternoon do task :make_coffee do Rake::Task[ 'morning:make_coffee' ].invoke puts "Ready for the rest of the day!" end end |
Rake脚本编写
先来个简单的例子,如下:
假设你是一个火星成员,老版本那些,即如燕儿虎跑之类的,在周末你打算去车车那边打火锅,然后集体PC去.对应这个情况,你需要为自己制定三个任务:搭车找车车、烤鱼和网吧PC.用vim创建创建一个名叫rakefile的文件(备注:Rake会在当前路径下寻找名叫Rakefile、rakefile、RakeFile.rb和rakefile.rb的rake文件),并键入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
desc "任务1 -- 搭车去车车那里" #这据说是个苦差,因为太远了 task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end |
打开命令行工具,进入这个文件所在目录,然后运行下面的命令,大致应该类似如下结果:
1
2
3
4
5
6
7
8
9
10
11
|
D:\work>rake busboy (in D:/work) 发现挫男 D:\work>rake bitchfish (in D:/work) 老板,先烤九斤鱼 D:\work\ruby_works\ruby_book>rake laundry (in D:/work) 我选中路 |
(备注:文字部分是没啥逻辑的,纯粹娱乐下...)
分析:
相信看完上面那段东东,你已经知道怎么搞了...现在介绍些基础知识,方便加深理解.从上面的代码可以知道,此文件一共定义了3个任务,desc是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.
1
2
3
4
5
|
D:\work>rake - -tasks (in D:/work) rake bitchfish #任务2 -- 烤鱼 rake busboy #任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了) rake pc 任务3 -- 网吧PC |
task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block,本例中只是简单输出你所要做的工作.需要注意的是代码
1
|
puts "发现挫男" |
完全是一个普通的Ruby语句,puts是Ruby中进行输出的一般性方法,可以看出,Rake任务可以完全使用Ruby的能力,这使得它非常强大.
go..go..go..go..
接下来加入依赖关系:
很显然,在我们定义的任务中,"烤鱼"是依赖于"搭车去车车那里"的(其它地方有没烤鱼吃不知道,反正地点就定在那了).那么,我们需要在我们的任务定义中加入这个依赖关系,修改后的文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
desc "任务1 -- 搭车去车车那里" task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish => :busboy do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end |
再次运行烤鱼任务,你会得到如下结果:
1
2
3
4
|
D:\work>rake bitchfish (in D:/work) 发现挫男 老板,先烤九斤鱼 |
加入命名空间:
跟任何编程语言类似,当你的rake文件很多时,当你有很多任务的时候,你需要关注它们的命名冲突问题,命名空间(namespace)就是一个自然的解决方案.你可以为上面的三个任务定义一个叫做dan的命名空间.
1
2
3
4
5
6
7
|
namespace :dan do desc "任务1 -- 搭车去车车那里" task :busboy do puts "发现挫男" end …… end |
再次运行rake --tasks,你会得到如下的结果:
1
2
3
4
5
|
D:\work >rake --tasks ( in D: /work ) rake dan:bitchfish # 任务2 -- 烤鱼 rake dan:pc # 任务3 -- 网吧PC rake dan:busboy # 任务1 -- 搭车去车车那里 |
你现在需要使用rake dan:bitchfish才能启动烤鱼这个任务了.
(BTW,你可以在你的rakefile中使用多个命名空间,对任务进行分类.)
了解了上面两个知识点后,我们来了解下两个具体实例:
1.在一个任务中调用另外一个任务
当任务众多的时候,你很可能需要在一个任务中调用另外一个任务,假设我们把今天所有要做的工作定义为一个任务:today.在这个任务中,有两个任务需要被调用,一个是烤鱼,一个是网吧PC.当然,由于烤鱼依赖于搭车去车车那里,我们还是需要搭车去车车那里的.在文件的顶部定义一个today的任务:
1
2
3
4
5
6
7
8
9
|
desc "今天的任务" task :today do Rake::Task[ "dan:bitchfish" ].invoke Rake::Task[ "dan:pc" ].invoke end namespace :dan do …… end |
可以看出,调用其它任务的方式很简单,只需要调用
1
|
Rake::Task[ "task_name" ].invoke |
方法就可以了.在命令行中启动rake today,可以得到:
1
2
3
4
5
|
D:\work >rake today ( in D: /work ) 发现挫男 老板,先烤九斤鱼 我选中路 |
2.默认任务:
可以为Rake增加一个默认任务,这样可以简单地用Rake命令来触发这个默认任务,在上面的rakefile中,我们可以用如下方式把"today"任务作为默认任务.
1
|
task :default => [ :today ] |
然后调用直接在命令行中调用rake,可以得到跟调用rake today同样的输出结果.
这就是我们简单的一个Rake任务定义,下面是完整的修改后的rakefile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
task :default => [ :today ] desc "今天的任务" task :today do Rake::Task[ "dan:bitchfish" ].invoke Rake::Task[ "dan:pc" ].invoke end namesoace :dan do desc "任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了)" task :busboy do puts "发现挫男" end desc "任务2 -- 烤鱼" task :bitchfish do puts "老板,先烤九斤鱼" end desc "任务3 -- 网吧PC" task :pc do puts "我选中路" end end |
看完上面两个例子,估计rake任务就算全部了解了...其它都是些代码枪花罢了..多耍便是..
Ruby中任务构建工具rake的入门的更多相关文章
- Ruby中任务构建工具rake的入门学习教程
参考:http://www.jb51.net/article/81476.htm Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake ...
- Java 中三大构建工具:Ant、Maven和Gradle
Java世界中主要有三大构建工具:Ant.Maven和Gradle 目前:Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是依赖管理系统 ...
- 前端构建工具-fis3使用入门
FIS3 是面向前端的工程构建工具.解决前端工程中性能优化.资源加载(异步.同步.按需.预加载.依赖管理.合并.内嵌).模块化开发.自动化工具.开发规范.代码部署等问题. 官网地址是: https:/ ...
- 前端打包构建工具gulp快速入门
因为之前一直有人给我推荐gulp,说他这里好哪里好的.实际上对我来说够用就行.grunt熟悉以后实际上他的配置也不难,说到效率的话确实是个问题,尤其项目大了以后,目前位置遇到的项目都还可以忍受.不过不 ...
- Ruby中的Profiling工具
看看如何调试Ruby的性能问题 李哲 - APRIL 08, 2015 Ruby内置的profiler 内置的profiler实现的很简单,在ruby2.2中只有150行代码,大家可以看看它的实现pr ...
- 前端打包构建工具grunt快速入门(大篇幅完整版)
打包的目的和意义就不用叙述了直接上干货 http://www.gruntjs.net/getting-started里面的教程也太简单了,需要下一番功夫去研究才行.本文将grunt打包的常用方法都用实 ...
- 前端自动化构建工具Gulp简单入门
昨天听同事分享了Gulp的一些简单使用,决定自己也试一试. 一.安装 gulp是基于nodejs的,所以要先下载安装node(直接搜node,在官网下载就好了) 1.全局安装gulp npm inst ...
- 动态补丁构建工具nuwa中的“坑”
1. 继承android中的Application的类A1Application:并且A2Application继承自A1Application,并且配置在清单文件中name=".A2App ...
- (转)前端构建工具gulp入门教程
前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具 ...
随机推荐
- Java定时器Web(转)
通过定时器进行任务的执行是比较常见的情况,下面的是个简单的示例: 主要借助于监听器和TimerTask和Timer类进行实现,另外spring提供了定时器的高级实现好像是quarts. package ...
- UVa10491 Cows and Cars
#include<iostream> #include<cstdio> #include<algorithm> int main(){ double a,b,c; ...
- 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- TYVJ3680 找妹子
时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...
- Laravel 控制器的response
public function response(){ //响应json $data = [ 'errCode' => 0, 'errMsg' => 'success', 'data' = ...
- delphi使用IdHTTP模拟提交页面方法总结
http://blog.csdn.net/lxdcyh/article/details/3986800 1.拖入TIdHTTP控件,HandleRedirect设为True,否则可能会出现HTTP 3 ...
- codevs——1049 棋盘染色
1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有一个5×5的棋盘,上面有一 ...
- PHP实现INT型,SHORT型,STRING转换成BYTE数组
实现PHP实现INT型,SHORT型,STRING转换成BYTE数组的转化: class Bytes { public static function integerToBytes($val) { $ ...
- 【kotlin】报错:required:LIst<XXX> found:List<Unit>此类型的问题
出现问题如下: 解决方式如下: 解决思路:上面报出来的错误很明显,就是说想要的是List<XXX>类型但是给的却是List<Unit>类型,给的不是它想要的嘛 关键就是解决问题 ...
- 求菲波那契数列的第n个数
1,2,3,5,8,13..... 求第n个数 def get_num(n): if n == 1: return 1 if n == 2: return 2 return get_num(n - 1 ...