一、方法定义:
ruby 代码
- def name[([arg [=value],.....][,*varg][,&blockarg])]
- body
- end
ruby 代码
- name -> methodName
- constant.methodname
- (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 代码
- [receiver.]name[parameter][block]
- [receiver::]name[parameter][block]
-
- parameters <--- ([param,.....][,hashlist][*array][&a_proc])
-
- block <--- {blockbody}
- do blockbody end
1、如果参数列表中出现一个以key=>value配对的列表,Ruby会将这个列表包装成一个新hash对象对待。作为一个参数传入方法。
ruby 代码
- def method(a,b,*c)
-
-
- end
-
- 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