8 最美不过简简单单

正如我们在上一篇文章中看到的那样,循环和迭代允许我们一遍遍地重复做相同的事情。但在现实中有时我们想在程序中其他地方重复做同样的事情。比如说我们在写一个面向心理专业学生所做的调查问卷,而我这里已经有一份他们提供给我的调查问卷,类似下面这样:

puts 'Hello, and thank you for taking the time to'
puts 'help me with this experiment.  My experiment'
puts 'has to do with the way people feel about'
puts 'Mexican food.  Just think about Mexican food'
puts 'and try to answer every question honestly,'
puts 'with either a "yes" or a "no".  My experiment'
puts 'has nothing to do with bed-wetting.'
puts

# We ask these questions, but we ignore their answers.

goodAnswer = false
while (not goodAnswer)
  puts 'Do you like eating tacos?'
  answer = gets.chomp.downcase
  if (answer == 'yes' or answer == 'no')
    goodAnswer = true
  else
    puts 'Please answer "yes" or "no".'
  end
end

goodAnswer = false
while (not goodAnswer)
  puts 'Do you like eating burritos?'
  answer = gets.chomp.downcase
  if (answer == 'yes' or answer == 'no')
    goodAnswer = true
  else
    puts 'Please answer "yes" or "no".'
  end
end

# We pay attention to *this* answer, though.
goodAnswer = false
while (not goodAnswer)
  puts 'Do you wet the bed?'
  answer = gets.chomp.downcase
  if (answer == 'yes' or answer == 'no')
    goodAnswer = true
    if answer == 'yes'
      wetsBed = true
    else
      wetsBed = false
    end
  else
    puts 'Please answer "yes" or "no".'
  end
end

goodAnswer = false
while (not goodAnswer)
  puts 'Do you like eating chimichangas?'
  answer = gets.chomp.downcase
  if (answer == 'yes' or answer == 'no')
    goodAnswer = true
  else
    puts 'Please answer "yes" or "no".'
  end
end

puts 'Just a few more questions...'

goodAnswer = false
while (not goodAnswer)
  puts 'Do you like eating sopapillas?'
  answer = gets.chomp.downcase
  if (answer == 'yes' or answer == 'no')
    goodAnswer = true
  else
    puts 'Please answer "yes" or "no".'
  end
end

# Ask lots of other questions about Mexican food.

puts
puts 'DEBRIEFING:'
puts 'Thank you for taking the time to help with'
puts 'this experiment.  In fact, this experiment'
puts 'has nothing to do with Mexican food.  It is'
puts 'an experiment about bed-wetting.  The Mexican'
puts 'food was just there to catch you off guard'
puts 'in the hopes that you would answer more'
puts 'honestly.  Thanks again.'
puts
puts wetsBed


上面的程序有些太长,许多代码都是重复的(围绕着食物问题的代码是一样的,只有在尿床的部分有些许不同)。代码重复总是件不好的事,但我们又没法将它们写成一个大的循环或迭代中去,因为我们通常会在问题中间做点其他事情。鉴于这种情况我们就很有必要写一个方法,比如下面这种:

def sayMoo
  puts 'mooooooo...'
end

但运行后程序没有输出sayMoo。这是为什么?因为我们还没有告诉它去输出(我们只是告诉程序如何做,但还没指示程序去做)。让我们再来试验一下:

mooooooo...
mooooooo...
coin-coin
mooooooo...
mooooooo...

嗯,成功运行。(考虑到你们可能不太了解法语,在程序中有一个法国的鸭子,因为在法国鸭子的叫声就是coin-coin

在上面的程序中我们就成功定义(define)了sayMoo的方法(方法的名字类似变量命名方式,以小写字母开头,但也有少数以+或==开头的例外)。但是难道方法不是通常要与对象一起用的吗?好吧,的确需要这样用,但上面的例子有些类似pusgets,方法是以整个程序为对象的,在下个章节中我们将会看到如何将方法与其他对象一起用上,但是我们要首先学习…

方法中参数的使用

你可能已经注意到类似gets``to_s``reverse等方法可以直接向对象进行调用,但类似+``-``puts等需要参数才能告诉对象如何使用这种方法。比如你不能仅仅用5+,是吧?你只是在告诉对象5去执行加法,但没告诉它增加多少……

为了给sayMoo增加参数(比如叫声的数量),可以这样做:

def sayMoo numberOfMoos
  puts 'mooooooo...'*numberOfMoos
end

sayMoo 3
puts 'oink-oink'
sayMoo  # This should give an error because the parameter is missing.

运行结果是:

mooooooo...mooooooo...mooooooo...
oink-oink
#<ArgumentError: wrong number of arguments (0 for 1)>

numberOfMoos是一个指向参数的变量:如果我键入的是sayMoo 3,那么参数是3,变量numberOfMoos是指向3的。

正如你所看到的:上面的程序中参数就是必须要提供的,别忘了如果你不提供参数,sayMoo要用什么去乘以'mooooooo...' ?你笨笨的电脑是有点懵逼的。

如果我们把Ruby中的对象比作英语中的名词,把Ruby中的方法比作动词,那么你可以把参数对应于英语中的副词(好比sayMoo,参数是教我们如何sayMoo)或某些情况下类似直接宾语(好比puts中的参数就是应该输出的相应内容)。

局部变量

在下面的代码中有两个变量:


输出结果是:
44 doubled is 88
两个变量分别是numnumTime2,它们都在我们定义的方法doubleThis中。类似之前你看到的所有变量都称作局部变量,因为这些变量只能在方法内部使用,在外部使用的话就会提示错误:

def doubleThis num
  numTimes2 = num*2
  puts num.to_s+' doubled is '+numTimes2.to_s
end

doubleThis 44
puts numTimes2.to_s

输出就会提示有错误:

44 doubled is 88
def_double.rb:7:in `<main>': undefined local variable or method `numTimes2' for main:Object (NameError)

提示中的undefined local variable…事实上我们的确定义了numTime2变量,但它没有位于我们想使用的地方,而只位于我们定义的方法中。

这样看似有些不便,但实际上确是非常棒的。在保证你没法更改方法中相应变量的同时,也确保其他人也无法随意改动,这样就不会将程序中的方法搞坏掉:

输出为:

HAHA!  I ruined your variable!
You can't even touch my variable!

在上面程序中有两个名字均为var的变量:一个在方法littlePest中,另一个则在方法外面。当我们用命令littlePest var时候,仅仅是字符串的传递,都指向同一个字符串。littlePest方法中将局部变量var指向nil,但对方法外部的另一个同样的变量var无任何影响。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,158评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,634评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 以前没怎么看过巴菲特的故事,只知道他是股神,很会投资,很会赚钱,但坦白来说,我对投资没什么兴趣,也不是那种会赚...
    云沐妈妈阅读 528评论 0 0
  • 似兰斯馨
    王中海阅读 133评论 0 1