十年修得柯景腾,百年修得王小贱,千年修得李大仁,万年修得湫哥哥。
嗯…,流程控制(Flow Control)是前面提到的内容的综合,尽管本章会比介绍方法的天外有天那一章要简短和容易些,但是它将打开涉及到编程潜能的整个世界(打通任督二脈 嘿嘿哈嘿)。学完这一章后我们就能够写出真正有交互的程序;在之前我们已经可以让程序输出不同的内容,但是要通过键盘输入的方式,但在本章之后程序可以真正在屏幕上显示出不同的内容。在我们能做到这之前,我们需要能够在程序中对不同的对象进行比较,我们就需要用到……
对比方法
我们可以快速浏览一下这部门内容,方便我们下一小节分支Branching
的学习,许多酷的内容都在里面。要比较一个对象比另一个要大于或小于,我们用 > 和 <:
puts 1 > 2
puts 1 < 2
输出结果正常,同样地我们比较一个对象比另一个大于等于或小于等于会用 >= 和 <= :
puts 5 >= 5
puts 5 <= 4
最后我们比较两个对象是否相同用 ==(表示“它们相等吗?”)和 !=(表示“它们不等吗?”)。能否区分 = 和 ==是很重要的,= 是告诉某个变量去指向某对象(是赋值过程),而 ==是在解答问题:“这两个对象是相等的吗?”
puts 1 == 1
puts 2 != 1
当然我们也可以进行字符串之间的比较。在进行字符串比较时,实际是比较字母的顺序,也就是字典中字符串先后的顺序。cat在字典中比dog靠前,因此:
puts 'cat' < 'dog'
这里需要有个了解:电脑处理对象的方式是它们会把大写字符放在小写字符前面(这就是它们处理字体的方法,比如所有大写的字符优先前置,然后才是小写字符),这就意味着电脑会认为“Zoo”要在"ant"前面,因此如果你想知道在真正的字典里哪个单词在前面,请确保在比较前两个单词都要用小写(或大写)。
在学习Branching
前还有一点要提的是:对比方法为我们输出的不是字符串 "true" 和 "false",它输出的是特殊的对象true
和false
.(当然用true.to_s
会输出字符串“true”)true
和false
会频繁运用在下面將要介紹的分支用法中……
分支Branching
分支是一个简单的定义,但是相当有用。它简单到我都没必要解释它,只需用下面的例子演示一下:
puts 'Hello, what\'s your name?'
name = gets.chomp
puts 'Hello, ' + name + '.'
if name == 'Chris'
puts 'What a lovely name!'
end
但是如果我们输入不一样的名字:
上面就是分支程序:如果在if后面的判断是ture的时候,程序将会运行if与end之间的代码;而如果if后面是false时就不会运行之间的代码,分支程序就是这么简单平直。
我将if与end之间的代码缩进仅是考虑这种方式能够更明显与分支程序保持关联,几乎所有的程序员不论使用哪种计算机语言都会像这样将代码缩进。在简单的程序中可能会看不出缩进有多大用处,但当程序变得更加复杂时缩进就会起到很大的便利了。
通常我们喜欢一个程序在条件为真时做A事情,当条件为假时做B事情,这时正好需要用到else:
puts 'I am a fortune-teller. Tell me your name:'
name = gets.chomp
if name == 'Chris'
puts 'I see great things in your future.'
else
puts 'Your future is... Oh my! Look at the time!'
puts 'I really have to go, sorry!'
end
现在让我们试一个不同的名字:
分支程序就像代码中的分叉一样:对于名字是“Chris”的人走的是一条路径,对于名字不是“Chris”的人走另外的路径。
正如一棵树的分叉一样,我们可以在已经有分支的程序中再嵌入分支:
puts 'Hello, and welcome to 7th grade English.'
puts 'My name is Mrs. Gabbard. And your name is...?'
name = gets.chomp
if name == name.capitalize
puts 'Please take a seat, ' + name + '.'
else
puts name + '? You mean ' + name.capitalize + ', right?'
puts 'Don\'t you even know how to spell your name??'
reply = gets.chomp
if reply.downcase == 'yes'
puts 'Hmmph! Well, sit down!'
else
puts 'GET OUT!!'
end
end
运行成功,现在我把名字大写:
有时可能会分不清代码中许多的if、else和end是用在哪个分支中,我个人的解决方法是在写if的同时就写上end,所以如果让我写上面的程序,我会写成如下的样式:
然后我在中间填充注释,电脑会自动忽略这些注释:
在#号后的所有内容都会被认为是注释,然后我会用代码替换掉注释。一些程序员会在程序中保留注释,我个人认为好的代码通常自身就能够很好的解释它自己(自解释),我以前会在程序中经常使用注释,但在接触Ruby后随着我对Ruby的不断熟悉,我开始变得很少用注释,并发现写注释会消耗掉许多时间。当然这只是个人的偏好,你会有属于自己的编程习惯。接下来我写程序的下一步是:
再一次,我会同时写下if,else和end。这样能够在写代码时帮助我理顺“我写的具体是哪个分支”,使我集中精力在一小部分中,在if与else之间填充代码,使得写程序变得更加容易;同时这样写的另一个好处是使电脑能够在任何时候识别出来程序编写的进度,我显示给你的任何一个未完成的程序版本都可以运行起来,虽然程序未完成但是可以顺利运行。这样就使得我能够边写程序边进行测试,来检查程序运行情况和哪部分程序还需要继续改进。当程序通过了所有的测试,编程就顺利完成了!
打完 收工!!