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) # 在指定的时间内睡眠,终止程序