如何实现Ruby向对象发送消息

Ruby语言做为一种解释型面完全面向对象的脚本语言,值得我们去深入研究。我们可以利用Ruby向对象发送消息。下面将为大家详细介绍相关方法。

我们可以直接实现Ruby向对象发送消息:

  1. class HelloWorld   
  2. def say(name)   
  3. print "Hello, ", name   
  4. end   
  5. end   
  6. hw = HelloWorld.new   
  7. hw.send(:say,"world")  

我们通常使用hw.say("world"),但send可以对private的方法起作用。 不光如此send可以使程序更加动态,下面我们看看一个例子:

我们定义了一个类Person,我们希望一个包含Person对象的数组能够按照Person的任意成员数据来排序实现Ruby向对象发送消息:

class Person   


attr_reader :name,:age,:height   


def initialize(name,age,height)   



@name,@age,@height = name,age,height   



end   


def inspect   


"#@name #@age #@height"   


end   


end  

在ruby中任何一个类都可以随时打开的,这样可以写出像2.days_ago这样优美的code,我们打开Array,并定义一个sort_by方法:

class Array   


def sort_by(sysm)   



self.sort{|x,y| x.send(sym) 
<=> y.send(sym)}   



end   


end  

我们看看运行结果:

people = []   



people << Person.new("Hansel",35,69)   




people << Person.new("Gretel",32,64)   




people << Person.new("Ted",36,68)   




people << Person.new("Alice", 33, 63)   




p1 = people.sort_by(:name)   




p2 = people.sort_by(:age)   




p3 = people.sort_by(:height)   



p p1 # [Alice 33 63, Gretel 32 
64, Hansel 35 69, Ted 36 68]   


p p2 # [Gretel 32 64, Alice 33 
63, Hansel 35 69, Ted 36 68]   


p p3 # [Alice 33 63, Gretel 32 
64, Ted 36 68, Hansel 35 69]  

这个结果是如何得到的呢?

其实除了send外还有一个地方应该注意attr_reader,attr_reader相当于定义了name, age,heigh三个方法,而Array里的sort方法只需要提供一个比较方法:

相关推荐