ruby中的代码块
代码块可以看作是一个没有名字的方法,他本身也是一个对象,一个Proc类的实例
匿名的代码块又两种创建方式
一种使用花括号包围的方式,
如
{puts "hello"}
另一种是do和end关键字
do
puts "hello"
end
代码块创建以后就可以将它与方法调用相关联,在方法中可以使用yield回调该代码块
如:
def test_function
puts "代码块开始"
yield
puts "代码快结束"
end
test_function{puts "hello"}
test_function do
puts"this is do and end !"
end
输出:
代码块开始
hello
代码快结束
代码块开始
this is do and end !
代码快结束
代码块接收参数的定义如下:
{|x| puts x}
do |x,y|
puts x+y
end
回调时为
yield 1
yield (1,2)
完整例子如下:
def test_function(arg)
yield arg
end
test_function("hello"){|x| puts x}
#输出 hello
迭代在ruby库中很多都使用了代码块
下面实现一个Array的each功能
class Array
def my_each
#遍历数组
for i in(0..self.length-1)
#将数组中的元素逐个传入代码块进行迭代
yield self[i]
end
end
end
[1,2,3,4].my_each{|x| puts x}
代码块的创建还可以通过Proc和lambda创建
通过lambda创建的代码块不会因代码块中含有return而返回,这是与Proc的一个区别
def proc_test
f = proc { return "从Proc代码中直接跳出" }
f.call
return "proc_test正常退出"
end
def lambda_test
f = lambda {return "从lambda代码中直接跳出" }
f.call
return "lambda_test正常退出"
end
puts proc_test
puts lambda_test
输出
从Proc代码中直接跳出
lambda_test正常退出
异常处理
结构如下
begin
#正常执行的代码
rescue Exception1
#处理Exception1类型的异常
rescue Exception2
#处理Exception2类型的异常
rescue =>err
#处理其他类型的异常
ensure
#最后总是被执行的代码,类似于java中的finally方法
end
例子:
x=10
y=0
begin
puts x/y
rescue ZeroDivisionError
y=2
retry #retry用于重复整个迭代周期
ensure
puts "总是被执行"
end