加载中...

习题 18: 命名、变数、程式码、函式


好大的一个标题。接下来我要教你“函式 (function)”了!咚咚锵!说到函式,不一样的人会对它有不一样的理解和使用方法,不过我只会教你现在能用到的最简单的使用方式。

函式可以做三件事情:

  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)函式”是同一个意思。


还没有评论.