好大的一個標題。接下來我要教你「函數 (function)」了!yooooo!說到函數,不一樣的人會對它有不一樣的理解和使用方法,不過我只會教你現在能用到的最簡單的使用方式。
函數可以做三件事情:
1. 它們可以給程序代碼片段取名,就跟「變量」給字符串和數字命名一樣。
2. 它們可以接受參數,就跟你的腳本接受 `ARGV` 一樣。
3. 通過使用 #1 和 #2 ,他們可以讓你創造出「迷你腳本」或者「微命令」。
你可以在 Ruby 中使用 `def` 新建函數,我將讓你創造四個不同的函數,它們運作起來和你的腳本一樣。然后我會示范給你各個函數之間的關系。
~~~
# this one is like your scripts with argv
def puts_two(*args)
arg1, arg2 = args
puts "arg1: #{arg1}, arg2: #{arg2}"
end
# ok, that *args is actually pointless, we can just do this
def puts_two_again(arg1, arg2)
puts "arg1: #{arg1}, arg2: #{arg2}"
end
# this just takes one argument
def puts_one(arg1)
puts "arg1: #{arg1}"
end
# this one takes no arguments
def puts_none()
puts "I got nothin'."
end
puts_two("Zed","Shaw")
puts_two_again("Zed","Shaw")
puts_one("First!")
puts_none()
~~~
讓我們把你一個函數 `puts_two` 分析一下,這個函數和你寫腳本的方式差不多,因此看上去你應該會覺得比較眼熟:
1. 首先我們告訴 Ruby 創造一個函數,使用 `def` 去「定義(define)」一個函數。
2. 緊跟著 `def `的是函數的名稱。本例中它的名稱是「puts_two」,但名字可以 隨便取,就叫「peanuts」也沒關系。但函數的名稱最好能夠表達出它的功能來。
3. 然后我們告訴函數我們需要 `args `(asterisk args),這和腳本的 `ARGV` 非常相似,參數必須放在小括號 () 中才能正常運作。
4. 在定義(definition)之后,后面的行都必須以 2 個空格縮排。其中縮排的第一行的作用是將參數解包,就像我們在腳本中做的事一樣。
5. 為了示范它的運作原理,我們把解包后的每個參數都輸出。puts_two 的問題是它不是建立一個函數最簡單的方法。在 Ruby 中我們可以直接跳過解包參數的過程直接使用` () `里面的名稱作為變量名。就像 `puts_two_again` 實現的功能。
接下來的例子是` print_one `,它像你示范了函數如何接收單個參數。
最后一個例子是 print_none ,它向你示范了函數可以不接收任何參數。
> Warning: 如果你不太能看懂上面的內容也別氣餒。這是非常重要的。后面我們還有更多的習題向你示范如何創造和使用函數。現在你只要把函數理解成「迷你腳本」就可以了
# 你應該看到的結果
* * * * *
執行上面的腳本會看到如下結果:
~~~
$ ruby ex18.rb
arg1: 'Zed', arg2: 'Shaw'
arg1: 'Zed', arg2: 'Shaw'
arg1: 'First!'
I got nothin'.
$
~~~
你應該看出來函數是怎樣運作的了。注意到函數的用法和你以前見過的 `File.exist`? 、 `File.open`以及別的「命令」有點類似了吧?其實我只是為了讓你容易禮節才叫他們「命令」。它們的本質其實就是函數。也就是說,你也可以在你自己的腳本中創造你自己的「命令」。
# 加分習題
* * * * *
為自己寫一個函數檢查清單以供后續參考。你可以寫在一個索引卡片上隨時閱讀,直到你記住所有的要點為止。注意事項如下:
1. 函函數定義是以 `def` 開始的嗎?
2. 函數名稱是以字符串和底線` _ `組成的嗎?
3. 函數名稱是不是緊跟著括號 `(` ?
4. 括號里是否包含參數?多個參數是否以逗號隔開?
5. 參數名稱是否有重復?(不能使用重復的參數名)
6. 緊跟著參數的最后是否括號 `)` ?
7. 緊跟著函數定義的代碼是否用了 2 個空格的縮進 ( indent )?
8. 函數結束的位置是不是「end」
當你執行(或者說「使用(use)」或者「調用(call)」一個函數時,記得檢查下列幾項事情:
1. 調用函數時是否使用了函數的名稱?
2. 函數名稱是否緊跟著`()`?(非必要,理想性的話應該要加)
3. 參數是否以逗號隔開?
4. 函數是否以`)`結尾?
按照這兩份檢查清單里的內容檢查你的習題,直到你不需要檢查清單為止。
最后,將下面這句話閱讀幾遍:
> 「執行(run)函數」、「調用(call)函數」和「使用(use)函數」是同一個意思。
- 笨方法更簡單
- 習題 00: 準備工作
- 習題 01: 第一個程序
- 習題 02: 注釋和#號
- 習題 03: 數字和數學計算
- 習題 04: 變量的命名
- 習題 05: 更多的變量和輸出
- 習題 06: 字符串和文字
- 習題 07: 更多輸出
- 習題 08: 輸出,輸出
- 習題 09: 輸出,輸出,輸出~
- 習題 10: 那是啥?
- 習題 11: 提問
- 習題 12: 模塊
- 習題 13: 參數,解包,參數
- 習題 14: 提示和傳遞
- 習題 15: 讀取文件
- 習題 16: 操作文件
- 習題 17: 更多的文件操作
- 習題 18: 命名,變量,代碼,函數
- 習題 19: 函數和變量
- 習題 20: 函數和文件
- 習題 21: 函數可以傳入信息
- 習題 22: 到現在你學到了什么?
- 習題 23: 閱讀一些代碼
- 習題 24: 更多練習
- 習題 25: 更多更多的練習
- 習題 26: 恭喜你,現在來考試了!
- 習題 27: 記住邏輯關系
- 習題 28: Boolean表達式練習
- 習題 29: 如果
- 習題 30: Else 和 If
- 習題 31: 做出判斷
- 習題 32: 循環和數組
- 習題 33: While
- 習題 34: 存取數組里的元素
- 習題 35: 分支和函數
- 習題 36: 設計和測試
- 習題 37: 重視各種符號