zoukankan      html  css  js  c++  java
  • Ruby入门(3)——方法、代码段

    Ruby中的方法是一个有名称的代码块,是与一个或多个对象关联的参数化的代码。调用时须给出方法名,接收者(所在对象),参数值,且最后一个表达式的值做为返回值。与Ruby方法相似的是代码块,它没有名字,且调用时只通过迭代器或被间接调用。

     

    (一)方法

    1)定义方法

    定义方法就是

    def 方法名(参数列表)

    方法体

    end

    最后一个表达式做为返回值返回,如果有值,则返回;无值则返回nil。可以省略return

    在类中定义的方法为实例方法,实例方法可以在类的实例对象上使用。如果是在一个特定的对象上定义方法,那么此方法就是一个单键方法,只能在这个对象上使用。

    class Test 
      def instance_method_test(v) 
        puts "#{v}: instance method" 
      end  
    end 
     
    t1=Test.new 
    t2=Test.new 
    t1.instance_method_test("t1") 
    t2.instance_method_test("t2") 
     
    def t1.singleton_method_test(v) 
      puts "#{v}:singleton method" 
    end 
     
    t1.singleton_method_test("t1") 
    #t2.singleton_method_test("t2") 

     

    ruby中,方法一般小写字母开头,如果超过一个单词,则由下划线隔开(看习惯)。有意思的是方法名可以以等号、问号、叹号结尾,且有不同的意义:以等号(=)结尾表示这是一个赋值方法(写属性);以问号(?)结尾表示一个断言方法,可以回答调用者提出问题的值,例如判断大小;叹号(!)结尾表示是一个可变方法,可能会影响到对象的状态,要小心使用。这三个符号很有意思,但它们不是必须的。

    2)取消方法

    通过undef 方法名 可以取消方法。对于被继承的方法,undef可以取消子类中的继承来的方法,但不会取消父类中的此方法。

    3)方法参数

    在参数中添加等号和值就可以为这一个参数设置默认值。如果参数有默认值,那么在调用方法时,可以为这个参数指定值或不指定值。

    def createRole(name,level=1
      puts "role name is#{:name} level is #{level}" 
    end 
     
    createRole("way") 
    createRole("clound",5

     

    通过在参数前边加星号(*),可以为方法指定为可变参数个数(数组参数),且指定的个数最多为一个。

    def add_Person(*users) 
      puts users 
    end 
    add_Person("a1","a2") 
    add_Person("a1","a2","a3") 

     

    如果要把数组传递给方法,要在数组前加星号(*)。

     

    (二)代码块

    方法调用后可以紧跟一个代码块,关联代码块的方法可以通过yield来调用。

    def showMessage(i) 
      yield i*2 
      print i 
    end 
     
    showMessage(5){|x|print "#{x}"} 

     

    代码块通过yield调用,也可以做为方法参数传递,但前提是这个参数前需要添加&做为前缀且为最后一个参数。而此时它以一个proc对象传递,调用时不能通过yield调用,而是通过proccall方法调用。另外,如果以显示方式,即传递proc对象给方法,那方法定义的参数就不加&前缀了。通过&前缀,代码块可以与任何方法调用关联起来,即使此方法没有yield语句。任何方法调用都可以用&参数作为最后一个参数。所有支持to_proc的方法都能用&

     

    #传递代码块,代码块参数须为最后一个,且添加&前缀;且调用时用proccall方法 
    def fun_block(i,&b) 
      b.call(i*2
    end 
    fun_block(2){|x|puts x} 
     
    #
    显示传递proc对象。那么方法中proc对象部分的参数不加&前缀 
    def fun_proc(i,b) 
      b.call(i*2
    end 
    p=Proc.new{|x|puts x} 
    fun_proc(2,p

     

    c=[1,2,3,4,5,6
    b=c.select{|x|x%2==0
    p1=Proc.new{|x|x%2==0
    d=c.select(&p1) 
    puts d

     

    代码块是Ruby的一种句法结构,不是对象,但可以创建对象来表示一个代码块。根据对象的创建方式,分为proclambdaproc行为与代码块相似;lambda行为与方法相似,但它们都是Proc类的实例。

     

    通过Proc.new创建一个proc,在1.9版本中,与proc方法为同义词;通过lambda方法,创建一个lambdalambda方法不带参数,调用时段关联一个代码块。

     

    ruby 1.9中,支持一种新的句法。将lambda换为->;将参数放到花括号外边,小括号里边;花括号中只保留表达式。(可以与.net3.*中的lambda比较:()=>{}

    #1.8k 
    d1=lambda{|x|x+1
    puts d1.call(5
    #1.9
    中,将lambda换为->;参数放到花括号外边,小括号里边;花括号中只保留表达式 
    #
    .net3.*中的lambda表达式很像()=>{} 
    d2=->(x){x+1
    d2.call(5

    这种新句法,使代码简洁,并使代码段与ruby方法的统一,例如:设置参数默认值。

     

    (三)闭包

    ruby中的proclambda都是闭包(closure)。闭包表示一个对象既是一个可调用的函数,同时也是绑定在这个函数上的一个变量。从表面上解释闭包就是:方法A内的方法B调用方法A的变量,并返回结果。方法B就是闭包。它的作用:一是B方法的变量可以在方法外使用;二是A方法中的变量可以安全使用;三是对B方法中的值进行缓存。

    (关于闭包,可以查看相关文档,我这里只是粗浅的认识。)

     

    博客园大道至简

    http://www.cnblogs.com/jams742003/

    转载请注明:博客园

  • 相关阅读:
    JVM调优(一)——参数查询和问题排查
    spring-cloud feign (web服务客户端)(四)
    spring-cloud hystrix(三)
    springCloud ribbon均衡负载的配置及原理 (二)
    maven
    springCloud Eureka 注册中心原理及配置理解(一)
    threadLocal 的使用及意义
    数据库引擎类型
    sql 优化
    sql 的执行计划理解
  • 原文地址:https://www.cnblogs.com/jams742003/p/2131126.html
Copyright © 2011-2022 走看看