8 最美不過(guò)簡(jiǎn)簡(jiǎn)單單

正如我們?cè)谏弦黄恼轮锌吹降哪菢硬柘h(huán)和迭代允許我們一遍遍地重復(fù)做相同的事情占卧。但在現(xiàn)實(shí)中有時(shí)我們想在程序中其他地方重復(fù)做同樣的事情。比如說(shuō)我們?cè)趯?xiě)一個(gè)面向心理專(zhuān)業(yè)學(xué)生所做的調(diào)查問(wèn)卷,而我這里已經(jīng)有一份他們提供給我的調(diào)查問(wèn)卷纹蝴,類(lèi)似下面這樣:

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


上面的程序有些太長(zhǎng),許多代碼都是重復(fù)的(圍繞著食物問(wèn)題的代碼是一樣的踪少,只有在尿床的部分有些許不同)塘安。代碼重復(fù)總是件不好的事,但我們又沒(méi)法將它們寫(xiě)成一個(gè)大的循環(huán)或迭代中去援奢,因?yàn)槲覀兺ǔ?huì)在問(wèn)題中間做點(diǎn)其他事情兼犯。鑒于這種情況我們就很有必要寫(xiě)一個(gè)方法,比如下面這種:

def sayMoo
  puts 'mooooooo...'
end

但運(yùn)行后程序沒(méi)有輸出sayMoo。這是為什么免都?因?yàn)槲覀冞€沒(méi)有告訴它去輸出(我們只是告訴程序如何做锉罐,但還沒(méi)指示程序去做)。讓我們?cè)賮?lái)試驗(yàn)一下:

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

嗯绕娘,成功運(yùn)行脓规。(考慮到你們可能不太了解法語(yǔ),在程序中有一個(gè)法國(guó)的鴨子险领,因?yàn)樵诜▏?guó)鴨子的叫聲就是coin-coin

在上面的程序中我們就成功定義(define)了sayMoo的方法(方法的名字類(lèi)似變量命名方式侨舆,以小寫(xiě)字母開(kāi)頭,但也有少數(shù)以+或==開(kāi)頭的例外)绢陌。但是難道方法不是通常要與對(duì)象一起用的嗎挨下?好吧,的確需要這樣用脐湾,但上面的例子有些類(lèi)似pusgets臭笆,方法是以整個(gè)程序?yàn)閷?duì)象的,在下個(gè)章節(jié)中我們將會(huì)看到如何將方法與其他對(duì)象一起用上秤掌,但是我們要首先學(xué)習(xí)…

方法中參數(shù)的使用

你可能已經(jīng)注意到類(lèi)似gets``to_s``reverse等方法可以直接向?qū)ο筮M(jìn)行調(diào)用愁铺,但類(lèi)似+``-``puts等需要參數(shù)才能告訴對(duì)象如何使用這種方法。比如你不能僅僅用5+,是吧闻鉴?你只是在告訴對(duì)象5去執(zhí)行加法茵乱,但沒(méi)告訴它增加多少……

為了給sayMoo增加參數(shù)(比如叫聲的數(shù)量),可以這樣做:

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

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

運(yùn)行結(jié)果是:

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

numberOfMoos是一個(gè)指向參數(shù)的變量:如果我鍵入的是sayMoo 3孟岛,那么參數(shù)是3瓶竭,變量numberOfMoos是指向3的。

正如你所看到的:上面的程序中參數(shù)就是必須要提供的渠羞,別忘了如果你不提供參數(shù)斤贰,sayMoo要用什么去乘以'mooooooo...' ?你笨笨的電腦是有點(diǎn)懵逼的。

如果我們把Ruby中的對(duì)象比作英語(yǔ)中的名詞堵未,把Ruby中的方法比作動(dòng)詞腋舌,那么你可以把參數(shù)對(duì)應(yīng)于英語(yǔ)中的副詞(好比sayMoo,參數(shù)是教我們?nèi)绾蝧ayMoo)或某些情況下類(lèi)似直接賓語(yǔ)(好比puts中的參數(shù)就是應(yīng)該輸出的相應(yīng)內(nèi)容)渗蟹。

局部變量

在下面的代碼中有兩個(gè)變量:


輸出結(jié)果是:
44 doubled is 88
兩個(gè)變量分別是numnumTime2块饺,它們都在我們定義的方法doubleThis中。類(lèi)似之前你看到的所有變量都稱作局部變量雌芽,因?yàn)檫@些變量只能在方法內(nèi)部使用授艰,在外部使用的話就會(huì)提示錯(cuò)誤:

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

doubleThis 44
puts numTimes2.to_s

輸出就會(huì)提示有錯(cuò)誤:

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

提示中的undefined local variable…事實(shí)上我們的確定義了numTime2變量,但它沒(méi)有位于我們想使用的地方世落,而只位于我們定義的方法中淮腾。

這樣看似有些不便,但實(shí)際上確是非常棒的。在保證你沒(méi)法更改方法中相應(yīng)變量的同時(shí)谷朝,也確保其他人也無(wú)法隨意改動(dòng)洲押,這樣就不會(huì)將程序中的方法搞壞掉:

輸出為:

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

在上面程序中有兩個(gè)名字均為var的變量:一個(gè)在方法littlePest中,另一個(gè)則在方法外面圆凰。當(dāng)我們用命令littlePest var時(shí)候杈帐,僅僅是字符串的傳遞,都指向同一個(gè)字符串专钉。littlePest方法中將局部變量var指向nil挑童,但對(duì)方法外部的另一個(gè)同樣的變量var無(wú)任何影響。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跃须,一起剝皮案震驚了整個(gè)濱河市站叼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菇民,老刑警劉巖尽楔,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異第练,居然都是意外死亡翔试,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)复旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冲泥,你說(shuō)我怎么就攤上這事驹碍。” “怎么了凡恍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵志秃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嚼酝,道長(zhǎng)浮还,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任闽巩,我火速辦了婚禮钧舌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涎跨。我一直安慰自己洼冻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布隅很。 她就那樣靜靜地躺著撞牢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋彪,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天所宰,我揣著相機(jī)與錄音,去河邊找鬼畜挥。 笑死仔粥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砰嘁。 我是一名探鬼主播件炉,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矮湘!你這毒婦竟也來(lái)了斟冕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缅阳,失蹤者是張志新(化名)和其女友劉穎磕蛇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體十办,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秀撇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了向族。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵燕。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖件相,靈堂內(nèi)的尸體忽然破棺而出再扭,到底是詐尸還是另有隱情,我是刑警寧澤夜矗,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布泛范,位于F島的核電站,受9級(jí)特大地震影響紊撕,放射性物質(zhì)發(fā)生泄漏罢荡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一对扶、第九天 我趴在偏房一處隱蔽的房頂上張望区赵。 院中可真熱鬧,春花似錦浪南、人聲如沸惧笛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)患整。三九已至拜效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間各谚,已是汗流浹背紧憾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昌渤,地道東北人赴穗。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像膀息,于是被迫代替她去往敵國(guó)和親般眉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,189評(píng)論 0 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法潜支,類(lèi)相關(guān)的語(yǔ)法甸赃,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法冗酿,異常的語(yǔ)法埠对,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,662評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裁替,斷路器项玛,智...
    卡卡羅2017閱讀 134,697評(píng)論 18 139
  • 以前沒(méi)怎么看過(guò)巴菲特的故事襟沮,只知道他是股神,很會(huì)投資昌腰,很會(huì)賺錢(qián)臣嚣,但坦白來(lái)說(shuō),我對(duì)投資沒(méi)什么興趣剥哑,也不是那種會(huì)賺...
    云沐媽媽閱讀 533評(píng)論 0 0
  • 似蘭斯馨
    王中海閱讀 134評(píng)論 0 1