分享

ruby系列教材(26):More about methods(1)

 漂在北方的狼 2006-12-06

本部分的内容对学习Rails有很大的意义,Rails中最常见的使用methods的方式:

redirect_to(:action => ‘index‘)

start_form_tag(:action => "save_order")

这里symbol object 还有 => 符号到底是什么意思?以及::这个符号的含义,本篇将会涉及

 

Method names

1.使用def关键字定义一个method

2.method name使用小写字母

3.method name可以使用?结尾,返回值为一个TrueClass或者FalseClass类型,意义上表示疑问,例如:

p [].empty?                # 意义:[]这个数组是空的吗?

结果:

true

 

def is_zero?(num)       # 带参数
  num==0
end
p is_zero?(1)
结果:
false

 

4.method name可以使用!结尾,表示这个method有一定的危险性,所谓的危险性就是method可以造成数据的丢失,!和?更多代表的是意义上的东西,而非语法上的东西

a = "I am here"
p a
a.chop!
p a
结果:

"I am here"
"I am her"

 

我们可以见到这样的情况,比如有些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
1 two three
1 2 three
1 2 3

 

有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)
    from -:6

 

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就可以表示任何组合,代码更加简洁

 

 

 

术语补充:

arguments 实际使用method的时候的,写在method后面的都叫arguments
parameters 在method定义的时候,写在method后面的都叫parameters

可能在前面的文章中,并没有太多区分这2个术语(有些资料的确不区分),可能带来一些问题,如果疑问,请联系我

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多