Ruby 方法定义和使用

 一、方法定义

ruby 代码
  1. def name[([arg [=value],.....][,*varg][,&blockarg])]   
  2. body   
  3. end  

 

ruby 代码
  1. name ->  methodName   
  2.                constant.methodname   
  3.               (expr).methodname  


    
    1、使用关键字def,方法名必须以一个小写字母开始。可以是重定义的操作符,也可以是个名字。
   
    2、习惯约定:表示查询的方法通常以?结尾;会修改接受者对象的方法,以!结尾;赋值方法以=结尾。
  
    5、在方法定义中不能定义非singleton的类或模块。如果在一个方法中定义另一个方法(可以是实例或单例方法),内部方法只有在外部方法执行是才能被定义。但是,在被嵌套的方法的上下文中,内部方法是一个自包含的。可以在被嵌套方法外调用


    6、方法的返回值是执行的最后一个表达式的值,或return表达式的返回值。如果return不带参数,返回值为nil,如果带一个参数,则返回该参数的值,如果参数多于一个,则返回一个包含所有参数值的数组对象。


    7、如果方法定义在类或模块中,由普通方法名字定义的方法是实例方法,一个实例方法仅能通过发送给它的名字给一个接收者调用,且该调用者必须是定义它的类的一个实例。
        如果是在类或模块外定义,由普通方法名定义的方法将作为私有方法添加到类Object中。因此,无须指定显示的接收者就可以在任意上下文中调用它。


    8、对于constant.methodname或(expr).methodname定义的方法名时,将创建一个与常量或表达式引用的对象相关联的方法。 该方法只能以表达式引用的对象作为接收者调用。这个定义风格将创建单个对象的方法或称为单例方法

 二、方法参数
    1、方法定义的普通形参是局部变量。后面可以跟一个等号作为默认值的表达式。表达式在方法被调用的时候求解。表达式是从左到右求解的。表达式可以引用参数列表中它前面已经定义的参数。


    2、可变个数参数或者想用一个形参接受多个实参,在"普通"的参数名前放置一个(*)号即可。这个带星号的参数必须放置在普通参数后面,Ruby设置数组参数使其引用一个数组类的对象。如果参数超过普通参数的个数时,所有剩余的参数会被装入到一个新的Array对象中,但是,如果没有超过普通参数,则该数组是个无内容的对象,但对象本身不为nil。如果,数组参数跟在带默认值的参数后面,那么参数优先被用了override默认值, 剩下的形成数组 
        def x(a,b=9,*c)
        
         ....
        end
        x(1) -> [1,9,[]]


    3、block参数(在普通的参数名前放置一个&符号)必须放在参数列表的最后一个。无论何时调用该方法时,都会检查是否有关联的块。如果有,块将被转换成Proc类的对象,然后赋值给块参数。如果没有块,该参数将设置为nil


三、方法的调用

ruby 代码
  1. [receiver.]name[parameter][block]   
  2. [receiver::]name[parameter][block]   
  3.   
  4. parameters     <---  ([param,.....][,hashlist][*array][&a_proc])   
  5.   
  6. block <--- {blockbody}   
  7.                 do blockbody end  


     1、如果参数列表中出现一个以key=>value配对的列表,Ruby会将这个列表包装成一个新hash对象对待。作为一个参数传入方法。

ruby 代码
  1. def method(a,b,*c)   
  2.   
  3.   #......   
  4. end  
  5.   
  6. method (1,'e'=>2,'f'=>3,4)       ---->  a=1,b={'e'=>2,'f'=>3},c=4  


     2、在形参后面出现一个前面带星号的参数,如果这个参数是一个数组,ruby将用相应的数组元素,将它替换零个或多个形参。如果不是,将为nil
     3、block可以关联一个方法调用。该调用可以使用字面量形式的block(它必须和方法调用的最后一行在同一行),也可以关联
     一个参数,该参数包含对带&符号的Proc或Method对象 的应用。
       注意:不管block参数存在与否,Ruby使用全局函数Kernel.block_given?方法的值来判断是否存在与本调用相关联的block

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值