如果您想说很多次“Hello”，却不想把手指累酸的话，是定义一个函数的时候啦！

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):010:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span>
<span class="gp">irb(main):011:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello World!"</span>
<span class="gp">irb(main):012:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

`def h` 定义一个函数。它告诉 Ruby 我们的函数名字是 `h`。下一行是函数的内容， 正是我们前面看到过的那行代码：`puts
"Hello World!"`。最后的一行 `end` 告诉 Ruby 函数的定义完成了。

## 函数的周期简短而又频繁

我们来试着把这个函数调用几次：

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):013:0&gt;</span><span class="w"> </span><span class="n">h</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):014:0&gt;</span><span class="w"> </span><span class="n">h</span><span class="p">()</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

很方便吧。在 Ruby 里调用函数就像提起 Ruby 的名字一样简单。如果函数不需要接受参数，
您只要提到它就够了。您可以加一对括号，但不是必需的。

如果您想对一个人而不是全世界说您好呢？只要让 `h` 函数接受一个参数就可以了。

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):015:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="gp">irb(main):016:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):017:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):018:0&gt;</span><span class="w"> </span><span class="n">h</span><span class="p">(</span><span class="s2">"Matz"</span><span class="p">)</span>
<span class="go">Hello Matz!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

和期待的一样。让我们再仔细看看究竟发生了什么。

## 在字符串中预留位置

啥是 `#{name}` 啊？这是 Ruby 用来往字符串中插入信息的方法。大括号里面的代码会被替换为评估后的字符串
（如果他们还不是字符串的话）然后插入到包含大括号的原始字符串中去。 您可以用这个方法将人名大写：

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):019:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"World"</span><span class="p">)</span>
<span class="gp">irb(main):020:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="p">.</span><span class="nf">capitalize</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):021:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):022:0&gt;</span><span class="w"> </span><span class="n">h</span> <span class="s2">"chris"</span>
<span class="go">Hello Chris!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):023:0&gt;</span><span class="w"> </span><span class="n">h</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

这里还有几个小窍门。第一是我们又一次省略了函数的括号。如果我们的命令看起来意图很明显的话， 函数的括号是可以省略的。另一个是函数缺省的参数值是
`World`。意思就是说 “如果 name 参数没有给出的话， name 的缺省值就设置为 `“World"`。

## 如何更有礼貌

让我们更有礼貌一些，不光记住您的名字，还在您到来的时候欢迎您，并且始终彬彬有礼。 您可以开始使用对象了。我们先建立 “Greeter”
(有礼貌的人) 类。

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):024:0&gt;</span><span class="w"> </span><span class="k">class</span> <span class="nc">Greeter</span>
<span class="gp">irb(main):025:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"World"</span><span class="p">)</span>
<span class="gp">irb(main):026:2&gt;</span><span class="w">     </span><span class="vi">@name</span> <span class="o">=</span> <span class="nb">name</span>
<span class="gp">irb(main):027:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):028:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">say_hi</span>
<span class="gp">irb(main):029:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Hi </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):030:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):031:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">say_bye</span>
<span class="gp">irb(main):032:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Bye </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">, come back soon."</span>
<span class="gp">irb(main):033:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):034:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

新的关键字 `class`！ 这个关键字定义了一个新的类 Greeter 和它的一些函数。 特别留意一下
`@name`，这是一个实例变量。类里面的任何函数都可以使用实例变量。 您可以看到 `say_hi` 和 `say_bye` 函数都使用了它。

下面我们要带着 Greeter 类出来活动活动了。[建立对象](../3/)
