本部分的内容对学习Rails有很大的意义,Rails中最常见的使用methods的方式:
这里symbol object 还有 => 符号到底是什么意思?以及::这个符号的含义,本篇将会涉及
Method names 1.使用def关键字定义一个method 2.method name使用小写字母 3.method name可以使用?结尾,返回值为一个TrueClass或者FalseClass类型,意义上表示疑问,例如: p [].empty? # 意义:[]这个数组是空的吗? 结果: true
def is_zero?(num) # 带参数
4.method name可以使用!结尾,表示这个method有一定的危险性,所谓的危险性就是method可以造成数据的丢失,!和?更多代表的是意义上的东西,而非语法上的东西 a = "I am here" "I am here"
我们可以见到这样的情况,比如有些class有empty?这个method,用来判断是否非空,也有empty!这个method用来清空数据,这样的方式是让人很乐意见到的,表达起来也很舒服
5.method name后面可以加=,注意这将有点不同于前面说过的加!,?这么简单,除了意义上层面之外,还有语法层面的东西 回忆一下前面谈到的accessor methods(又叫attribute methods,简称attribute),accessor methods用于存取instance variables,对于reader attribute应该没有任何疑问,因为它就是一个普通的method,只是我们习惯上把它命名成为instance variable name而已,但是对于writer attribute,我们就应该注意了,它形如: class T def initialize(t) @text = t end def text=(t) @text = t end end 使用的时候如下: t = T.new t.text = "hi" #text和=间有空格
也就说method name可以用=结尾,使用的时候=和前面的部分可以分开,这就是=于!,?在语法层面的差别(这是一个人性化的设计)。 在意义层面上说,accessor name要和它对应的instance variable相同(不要@符号),表示对有关vairable的存取
补充一下,我们同一的叫=,?,!等为suffix(后缀)
Method parameters 1.default values(默认值) 一个method可以为其parameters设定默认值,比如: def test(args1="one",args2="two",args3="three") print args1," ",args2," ",args3," \n" end test test(1) test(1,2) test(1,2,3) 结果: one two three
有default values的method,被赋予default value的parameter可以不需要在调用的时候传递一个arguments进去,假如没有默认值,则必须传递arguments : def test(args1,args2) p args1," ",args2 end test 结果: in `test‘: wrong number of arguments (0 for 2) (ArgumentError)
2.Variable-Length Arugment Lists(可变长度的参数列表)---method overloading(方法的重载)的ruby实现 method的可以有一个特殊的parameters---以星号开始,比如: def test(*args) p args end test("one",1,3.14,(1..3)) # Arugment Lists test(1,2,3) # Arugment Lists 结果: ["one", 1, 3.14, 1..3] [1, 2, 3]
我们可以清楚的看见,args在这里是一个Array object 在定义methods的时候使用一个特殊的parameter,它以*为开始,这个parameter实际上是一个数组,在Arugment Lists中,第一个arugment放在数组的0位置,以此类推。在前面的文章中,也提到过这样的定义方式,为此还讨论了ruby中多态(polymorphism),重载(overloading),覆盖(overriding)的问题,在《多态(polymorphism),重载(overloading),覆盖(overriding)和ruby》一文中提到,ruby是没有overloading的,但是ruby可以使用不同的参数列表,比如File.open等很多很多的method,在这里,就详细描述了ruby中的实现,相比下ruby的这种实现方式会更加具有优越性。举例说明一下: def add(*args) sum = 0 args.each{|i| sum+=i} sum end p add(1,2,3) 假如通过重载,那么需要有无数个定义,因为arguments是不确定的。即使在arguments固定的情况下使用ruby的做法也是有一定的优势,我们知道重载要做的事情就是:1.确定parameters,并进行定义 2.对每一个不同的parameters的组合进行具体实现。ruby的做法使得1步骤不用做了,因为一个带星号的parameter就可以表示任何组合,代码更加简洁
术语补充:
可能在前面的文章中,并没有太多区分这2个术语(有些资料的确不区分),可能带来一些问题,如果疑问,请联系我
|
|