正在加载...
 
< ruby系列教材(2...
Rubyweaver... >
ruby系列教材(26):More about methods(1) 
  主题:[Ruby] | 标签:Ruby | 浏览数(2281) | 评论数(0) | 2006-08-16

本部分的内容对学习 Rails 有很大的意义,Rails 中最常见的参数:

redirect_to(:action => 'index')

start_form_tag(:action => "save_order")

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

 

方法名

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

2. 方法名字使用小写字母

3. 方法名字可以使用 ? 结尾,这是我们通常让方法返回一个 TrueClass 对象或者 FalseClass 对象,例如:

p [].empty?                # 意义上同于 is_empty

结果:

true

 

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

 

4. 方法名可以使用 ! 结尾,表示这个方法有一定的危险性,所谓的危险性就是方法会改变调用其的对象,! 和 ? 更多代表的是意义上的东西,而非语法上的东西

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

"I am here"
"I am her"

 

我们可以见到这样的情况,比如有些类有 empty? 这个方法,用来判断是否非空,也有 empty! 这个方法用来清空数据,这样的方式是让人很乐意见到的,表达起来也很舒服。

 

5. 方法名后面可以加 =

class T

  def initialize(t)

    @text = t

  end

  def text=(t)

    @text = t

  end

end

使用的时候如下:

t = T.new

t.text = "hi"     # text 和 = 间有空格

 

也就说方法名可以用 = 结尾,使用的时候 = 和前面的部分可以分开,这就是 = 和 !,? 在语法层面的差别。

 

补充一下,我们统一的叫 =,?,! 等为后缀(suffix)

 

方法的参数

1. 默认值(default values)

一个方法可以为其参数设定默认值,比如:

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

 

2. 可变长度的参数列表(Variable-Length Arugment Lists)

方法的可以有一个特殊的参数 --- 以星号开始,比如:

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 对象

在定义方法的时候使用一个特殊的参数,它以 * 为开始,这个参数实际上是一个数组,在 Arugment Lists 中,第一个参数放在数组的 0 位置,以此类推。在前面的文章中,也提到过这样的定义方式,为此还讨论了 Ruby 中多态(polymorphism),重载(overloading),覆盖(overriding)的问题,在《多态(polymorphism),重载(overloading),覆盖(overriding)和ruby》一文中提到,因为 Ruby 语言本身的一些特点,导致 Ruby 中没有重载(overloading),但是 Ruby 可以使用不同的参数列表,诸如 File.open 等很多很多的方法,在这里,就详细描述了 Ruby 中的实现,相比下 Ruby 的这种实现方式会更加具有优越性。举例说明一下:

def add(*args)
  args.inject {|sum, ele| sum + ele}
end

p add(1, 2)

p add(1, 2, 3)

p add(1, 2, 3, 4)

假如通过重载,那么需要有无数个定义,因为参数是不确定的。即使在参数固定的情况下使用 Ruby 的做法也是有一定的优势,我们知道重载要做的事情就是:

1)确定参数,并进行定义

2)对每一个不同的参数的组合进行具体实现。Ruby 的做法使得第一步不用做了,因为一个带星号的参数就可以表示任何组合,代码更加简洁

 

术语补充:

arguments 实际使用方法的时候的,写在方法后面的都叫实参(arguments)
parameters 在方法定义的时候,写在方法后面的都叫形参(parameters)

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

http://www.i170.com/Article/34904/trackback

评论:

Powered by Haiwit