zoukankan      html  css  js  c++  java
  • ruby简单的基础 5

    方法和代码块



    在Ruby中。{}或do...end之间的代码是一个代码块。
    代码块只能出如今一个方法的后边,它紧接在方法最后一个參数的同一行上,一般由yieldkeyword调用代码块中的代码。




    方法是一个有名的代码块。是与一个或者多个对象相关联的參数化代码。


    调用方法时必需要给出方法名、所在对象(接受者),以及零个或者多个參数值,方法中最后一个表达式的值将作为方法调用的返回值。


    代码块不是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把这个位坑给添了才干使用这个函数。  

    def block_test(num)
    	if block_given?
    		#yield #无參数
    		yield (num)
    	else
    		puts num
    	end
    
    
    end
    
    
    #block_test(1)
    #block_test(2) { puts "this is a block ..."}
    block_test(2) {|x| puts x * 2}
    



    或者在方法的后面加上一个參数,并用&作为这个參数的前缀,这样这个參数就会指向传给方法的代码块,这个參数的值是个Proc对象。它不是通过yield调用的,而是call调用的。
    def proc_test(num,&b)
    
    
    	if block_given?
    	 	#b.call
    		b.call(num * 3)
    	else
    		puts "no block"
    	end
    
    
    end
    
    
    #proc_test(1) 
    #proc_test(1) {puts "this is a block"}
    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对象,这个对象代表这个关联的代码块。


    p = Proc.new { puts "hello,dear..."}
    
    
    def proc_test(&pp)
    	pp.call
    end




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


    puts lambda{|x| x + 10}.call(2)



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




    代码块,proc。lambda的return
    一个代码块中的return语句不仅会从调用代码块的迭代器中返回,还会从调用迭代器的的方法中返回。

    def test
    	puts "start.."
    	2.times {puts "hello,";return}
    	puts "end..." #不会别打印
    end




    proc和代码块相似,所以假设在调用的proc中运行一个return语句,它会试图从代码块所在的方法中返回。
    而在lambda中的return语句只时从lambda自身返回。


    def pro_fun (msg)
    	puts "start..."
    
    
    	p = Proc.new {puts "hello,#{msg}";return} #会从代码块所在的方法pro_fun中返回
    	p.call
    
    
    	puts "end..."
    end
    
    
    def lambda_fun(msg)
    	puts "start.."
    	lam = lambda {puts "hello,#{msg}";return} #只返回自身
    	lam.call
    	puts "end..."
    end
    
    
    def test
    	puts "test start"
    	#pro_fun "song"
    	lambda_fun "song"
    	puts "test end"
    end
    
    
    test



  • 相关阅读:
    数据库进阶系列之二:细说数据库范式
    ORACLE HANDBOOK系列之三:树状结构查询(Hierarchical Queries)
    Tips&Tricks系列八:Fail to convert .vsmid,.testrunconfig
    Java基础系列之四:Remote Debug入门示例
    Java基础系列之五:Spring使用入门示例
    数据库进阶系列之三:使用Logminer解析Oracle日志
    ORACLE HANDBOOK系列之四:批量SQL(BULK SQL)
    Tips&Tricks系列九:数据库外键的两个细节
    Tips&Tricks系列六:ADO.NET OracleConnection.ClearPool(conn)
    Java基础系列之六:CORBA入门示例
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5259871.html
Copyright © 2011-2022 走看看