
本部分的内容对学习 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 个术语(有些资料的确不区分),可能带来一些问题,如果疑问,请联系我
Powered by Haiwit