Friday, October 24, 2008

(2)方法的命名

Ruby中的方法命名没有强制的要求,但是按照惯例,方法以小写字母开头,如果以大写字母开头通常会被任务是一个常量;如果方法中包含多个单词,那么每个单词之间用下划线分隔,而不是传统的驼峰式写法,比如:按惯例方法名写成like_this而不是likeThis。但是记住这只是一种约定,Ruby语法解析器没有强制要求你这样做。
另外要说到的是Ruby中方法可以以等号=,问号?和叹号结尾。以等号结尾的方法它的参数可以通过赋值的方式传递,这个我们之前就提到过。按照约定,以问号结尾的方法一般是告诉调用者,这个方法返回的是一个布尔值,比如Array的empty?用于判断数组是否为空,以!结尾的方法提醒程序员这个方法会更高对象内部的状态,比如Array的sort方法用于排序数组内的元素,返回的是一个新的数组拷贝,但是sort!方法是将当前数组重新排序并返回数组本身,一般Ruby的核心类库中都会提供两同名方法,一个有!结尾一个没有。但是记住这只是一种约定,Ruby语法解析器没有强制要求你这样做。
符号方法
Ruby中所有的操作符号都定义成了方法,比如+,-,*,/ []等等,所以你可以通过重载自定义符号方法。比如:
def +(other)               # 定义二进制的加法操作: x+y is x.+(y)
  self.concatenate(other)
end
但是值得注意的是,你只能使用我们以前讲到的Ruby中操作符中定义的操作符,也就是说你不能发明一个这些操作符以为的操作符。
方法别名
有时候我们用的方法有一个很长的名字,如果我们多次调用它时不得不一次次重复的写这个冗长的名字,幸运的是Ruby对方法提供了一个别名操作符alias,你可以通过这种方式给一个方法取另外一个别名:
alias aka also_known_as   # 给方法起个别名
 
看到这个你想到了什么?我想到了Python中的import some.module.clzz as clz,是不是很像?
执行了这个方法后aka就相当于also_known_as方法。这种语法结构让Ruby程序代码看起来更“清晰”,比如Range对象有一个方法用于判断某个元素是否位于其中,include?还记得吧,如果你的Range是某州类型的集合,那么另一个别名方法member?看起来让代码更容易阅读。
另外一个有用的功能是,你可以通过这种方式给一个已经存在的方法动态的增加新的功能,比如下面这样:
def hello                       # 定义一个简单的方法
  puts "Hello World"            # 假设现在我们想扩展它的功能...
end

alias original_hello hello      # 给已经存在的方法取一个别名

def hello                       # 现在我们用之前的那个方法名定义一个新的方法
  puts "Your attention please"  # 加入新的打印功能
  original_hello                # 调用之前的方法
  puts "This has been a test"   # 加入另一个功能
end
现在你在执行hello方法得到的结果将是:
Your attention please
Hello World
This has been a test
Ruby的方法名是不能重复的,在一些静态语言中,比如Java,你可以拥有相同方法名的方法,他们的参数个数和类型不同,这称之为方法重载,这在Ruby中是不允许的。
不过Ruby中不要求定义参数的类型,所有者意味着你可以传递任意的参数给一个方法,而且Ruby的方法参数可以有缺省值,你甚至可以不给已经有缺省值的参数传值。我们后面的章节中将详细讲解这部分。

No comments: