ruby简单的基础

来源:互联网 发布:平面设计和美工的区别 编辑:程序博客网 时间:2024/05/17 22:58

方法和代码块



在Ruby中,{}或do...end之间的代码是一个代码块。
代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,一般由yield关键字调用代码块中的代码。


方法是一个有名的代码块,是与一个或者多个对象相关联的参数化代码。
调用方法时必须要给出方法名、所在对象(接受者),以及零个或者多个参数值,方法中最后一个表达式的值将作为方法调用的返回值。


代码块不是ruby可操作的对象,一般我们用一个Proc对象代表一个代码块。
有两种方式的Proc对象,一种是proc,一种是lambda,他们都是闭包:他们会保持定义时所在范围内的局部变量,即使在外部范围被调用时,他们也可以对这些变量进行访问。


方法的定义就不说了,前面有说过。
方法名以小写字母开头,如果方法名超过一个字母,一般用下划线分割开来。


方法可选的圆括号

在许多方法调用中圆括号是可省略的,如 puts “hello” 和 puts (“hello”)是一样的。
ruby是一种强面向对象的语言,他的对象被完全封装,与他们交流的唯一方式就是调用他们的方法,所以 len = "hello".length 其实是 len = “hello”.length(),只不过把圆括号省略掉了,你看起看好像是他的属性访问。
一般情况下,如果参数超过一个,最好不要省略圆括号。


代码块参数

传统方式就是代码块直接跟在方法后面,并用yield来调用代码块。
在函数里面的有一条yield语句,到时候执行的时候可以执行函数外的block。而且这个block可以有自己的context, 感觉有点像callback,又有点像c里面的宏定义。
有人说yield就充当一个占位符的作用,函数先给一个占位符,这个函数如同一个纯需函数一样不能直接调用,必须用block把这个位坑给添了才能使用这个函数。  
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. def block_test(num)  
  2.     if block_given?  
  3.         #yield #无参数  
  4.         yield (num)  
  5.     else  
  6.         puts num  
  7.     end  
  8.   
  9.   
  10. end  
  11.   
  12.   
  13. #block_test(1)  
  14. #block_test(2) { puts "this is a block ..."}  
  15. block_test(2) {|x| puts x * 2}  



或者在方法的后面加上一个参数,并用&作为这个参数的前缀,这样这个参数就会指向传给方法的代码块,这个参数的值是个Proc对象,它不是通过yield调用的,而是call调用的。
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. def proc_test(num,&b)  
  2.   
  3.   
  4.     if block_given?  
  5.         #b.call  
  6.         b.call(num * 3)  
  7.     else  
  8.         puts "no block"  
  9.     end  
  10.   
  11.   
  12. end  
  13.   
  14.   
  15. #proc_test(1)   
  16. #proc_test(1) {puts "this is a block"}  
  17. proc_test(1) {|x| puts x * 2}  


创建Proc对象的3种方式

Proc.new
如果在方法的最后一个形参前增加一个”&”符号,那么Ruby会把这个形参作为一个Proc对象处理。
所有的Proc对象都有一个call的方法,当调用这个方法时,会运行创建这个Proc对象时定义的代码块。
如果Proc.new不带参数,返回一个proc方式的Proc对象。Proc对象有proc方式、lambda方式。
如果Proc.new带参数,返回一个关联代码块的Proc对象,这个对象代表这个关联的代码块。
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. p = Proc.new { puts "hello,dear..."}  
  2.   
  3.   
  4. def proc_test(&pp)  
  5.     pp.call  
  6. end  




Kernel.lambda
lambda方法返回的是一个lambda方式的Proc对象。
lambda方法不带参数,但是在调用时必须关联一个代码块。


[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. puts lambda{|x| x + 10}.call(2)  



Kernel.proc
这个1.8是lambda的同义词,1.9是Proc.new的同义词。
这个就不说了。


代码块,proc,lambda的return
一个代码块中的return语句不仅会从调用代码块的迭代器中返回,还会从调用迭代器的的方法中返回。
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. def test  
  2.     puts "start.."  
  3.     2.times {puts "hello,";return}  
  4.     puts "end..." #不会别打印  
  5. end  




proc和代码块类似,所以如果在调用的proc中执行一个return语句,它会试图从代码块所在的方法中返回。
而在lambda中的return语句仅仅时从lambda自身返回。
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  1. def pro_fun (msg)  
  2.     puts "start..."  
  3.   
  4.   
  5.     p = Proc.new {puts "hello,#{msg}";return} #会从代码块所在的方法pro_fun中返回  
  6.     p.call  
  7.   
  8.   
  9.     puts "end..."  
  10. end  
  11.   
  12.   
  13. def lambda_fun(msg)  
  14.     puts "start.."  
  15.     lam = lambda {puts "hello,#{msg}";return} #仅仅返回自身  
  16.     lam.call  
  17.     puts "end..."  
  18. end  
  19.   
  20.   
  21. def test  
  22.     puts "test start"  
  23.     #pro_fun "song"  
  24.     lambda_fun "song"  
  25.     puts "test end"  
  26. end  
  27.   
  28.   
  29. test  
  30. www.aibang.com/detail/700432115-423278073/product/15432865.html
    www.aibang.com/detail/700432115-423278073/product/15432949.html
    www.aibang.com/detail/700432115-423278073/product/15433025.html
    www.aibang.com/article/700432115-423278073/product/15433121.html
    www.aibang.com/detail/700432115-423278073/product/15433199.html
    www.aibang.com/detail/700432115-423278073/product/15433289.html
    www.aibang.com/detail/700432115-423278073/product/15433377.html
    www.aibang.com/detail/700432115-423278073/product/15433463.html
    www.aibang.com/detail/700432115-423278073/product/15433527.html
    www.aibang.com/detail/700432115-423278073/product/15433611.html
    www.aibang.com/detail/700432115-423278073/product/15433685.html
    www.aibang.com/article/700432115-423278073/product/15433741.html
    www.aibang.com/detail/700432115-423278073/product/15433911.html
    www.aibang.com/detail/700432115-423278073/product/15433965.html
    www.aibang.com/detail/700432115-423278073/product/15434017.html
    www.aibang.com/detail/700432115-423278073/product/15434105.html
    www.aibang.com/detail/700432115-423278073/product/15434189.html
    www.aibang.com/article/700432115-423278073/product/15434241.html
    www.aibang.com/article/700432115-423278073/product/15434701.html
    www.aibang.com/detail/700432115-423278073/product/15434759.html
    www.aibang.com/detail/700432115-423278073/product/15434833.html
    www.aibang.com/detail/700432115-423278073/product/15434903.html
    www.aibang.com/detail/700432115-423278073/product/15434969.html
    www.aibang.com/detail/700432115-423278073/product/15435035.html
    www.aibang.com/detail/700432115-423278073/product/15435079.html
    www.aibang.com/detail/700432115-423278073/product/15435805.html
    www.aibang.com/detail/700432115-423278073/product/15435849.html
    www.aibang.com/detail/700432115-423278073/product/15436053.html
    www.aibang.com/detail/700432115-423278073/product/15436085.html
    www.aibang.com/article/700432115-423278073/product/15436121.html
    www.aibang.com/detail/700432115-423278073/product/15436191.html
    www.aibang.com/detail/700432115-423278073/product/15436233.html
    www.aibang.com/detail/700432115-423278073/product/15436377.html
    www.aibang.com/detail/700432115-423278073/product/15436437.html
    www.aibang.com/article/700432115-423278073/product/15436481.html
    www.aibang.com/detail/700432115-423278073/product/15436905.html
    www.aibang.com/detail/700432115-423278073/product/15437189.html
    www.aibang.com/detail/700432115-423278073/product/15437211.html
    www.aibang.com/detail/700432115-423278073/product/15437235.html
    www.aibang.com/detail/700432115-423278073/product/15437267.html
0 0
原创粉丝点击