好大的一个标题。接下来我要教你「函数 (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: 重视各种符号