方法

一个方法是一个代码命名块,通过在除了名称参数的列表与一个或多个对象相关联的,并且通常鉴定。

def hello(name)
  "Hello, #{name}"
end

方法调用指定方法名称,调用它的对象(有时称为接收方),以及分配给命名方法参数的零个或多个参数值。方法中计算的最后一个表达式的值将成为方法调用表达式的值。

hello("World")
# => "Hello, World"

当接收器不明确时,它是 self

self
# => main

self.hello("World")
# => "Hello, World"

正如 Ruby Programming Language 一书中所解释的,许多语言区分了没有关联对象的函数和在接收器对象上调用的方法。因为 Ruby 是纯粹的面向对象语言,所以所有方法都是真正的方法,并且至少与一个对象相关联。

方法参数概述

类型 方法签名 调用示例 分配
[R equired def fn(a,b,c) fn(2,3,5) a=2, b=3, c=5
V ariadic def fn(*rest) fn(2,3,5) rest=[2, 3, 5]
D efault def fn(a=0,b=1) fn(2,3) a=2, b=3
K eyword def fn(a:0,b:1) fn(a:2,b:3) a=2, b=3

这些参数类型可以以你可以想象的任何方式组合以创建可变参数函数。函数的最小参数数量等于签名中所需参数的数量。额外参数将首先分配给默认参数,然后分配给*rest 参数。

类型 方法签名 调用示例 分配
R,d,V,R def fn(a,b=1,*mid,z) fn(2,97) a=2, b=1, mid=[], z=97
fn(2,3,97) a=2, b=3, mid=[], z=97
fn(2,3,5,97) a=2, b=3, mid=[5], z=97
fn(2,3,5,7,97) a=2, b=3, mid=[5,7], z=97
R,K,K def fn(a,g:6,h:7) fn(2) a=2, g=6, h=7
fn(2,h:19) a=2, g=6, h=19
fn(2,g:17,h:19) a=2, g=17, h=19
VK def fn(**ks) fn(a:2,g:17,h:19) ks={a:2, g:17, h:19}
fn(four:4,five:5) ks={four:4, five:5}