`
酷的飞上天空
  • 浏览: 517958 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

ruby语法三

阅读更多

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics