ruby 方法的定义

(1)不带参数的方法

def function_name
   statement
    ……
end

调用方式:

function_name  or 
function_name()

(2)带参数的方法定义

def function_name(parm1, parm2, …)
   statement
    ……
end

调用方式:

function_name(parm1,parm2, …)
or
function_nameparm1, parm2, …

(3)可变参数的方法定义

通过用“* 变量名”的形式来定义参数个数不确定的方法。


def foo(*args)
    args
end
p foo(1, 2, 3)

#至少需要指定一个参数的方法可以像下面这样定义
def meth(arg, *agrs)
    [arg, args]
end
p meth(1)
p meth(1, 2, 3)

(4)关键字参数的方法定义

使用关键字参数定义方法的语法如下所示:


def 方法名(参数1: 参数1的值, 参数2: 参数2的值, …)
 希望执行的处理
end

除了参数名外,使用“参数名 : 值”这样的形式还可以指定参数的默认值。用关键字参数改写计算立方体表面积的 area 方法的程序如下所示:


def area2(x: 0, y: 0, z: 0)
    xy = x * y
    yz = y * z
    zx = z * x
    (xy + yz + zx ) * 2
end
p area2(x: 2, y: 3, z: 4)
p area2(z: 4, y: 3, x: 2)
p area2(x: 2, z: 3) #=> 12

备注:可以用散列作为实参传递给方法的关键字参数,实例如下:


def area2(x: 0, y: 0, z: 0)
    xy = x * y
    yz = y * z
    zx = z * x
    (xy + yz + zx ) * 2
end
 
args1 = {x: 2, y: 3, z: 4}
p area2(args1)
 
args2 = {x: 2, z: 3}
p area2(args2)

(5)带块的方法定义

def myloop
    while true
        yield # 执行块
    end
end
num= 1 # 初始化num
myloop do
    puts "num is #{num}" # 输出num
    break if num > 100 # num超过100时跳出循环
    num *= 2  # num乘2
end

这里第一次出现了 yield,yield 是定义带块的方法时最重要的关键字。调用方法时通过块传进来的处理会在 yield 定义的地方执行。执行该程序后,num 的值就会像 1、2、4、8、16……这样 2 倍地增长下去,直到超过 100 时程序跳出 myloop 方法。


备注:方法的调用可以省略小括号()


2.Ruby方法的分类

(1)实例方法

实例方法是最常用的方法。假设有一个对象(实例),那么以这个对象为接收者的方法就被称为实例方法。举例来说

p "10, 20, 30, 40".split(",") #=> ["10", "20", "30", "40"]
p [1, 2, 3, 4].index(2) #=> 1
p 1000.to_s #=> "1000"

(2)类方法

接收者不是对象而是类本身时的方法,我们称之为类方法。例如,我们在创建对象的时候就使用到了类方法。

Array.new # 创建新的数组
File.open("some_file") # 创建新的文件对象
Time.now # 创建新的 Time 对象

调用类方法时,可以使用 :: 代替.。在 Ruby 语法中,两者所代表的意思是一样的。

类名.方法名
类名::方法名

(3)函数式方法

没有接收者的方法,我们称之为函数式方法。

print "hello!" # 在命令行输出字符串
sleep(10) # 在指定的时间内睡眠,终止程序