Ruby语言做为一种解释型面完全面向对象的脚本语言,值得我们去深入研究。我们可以利用Ruby向对象发送消息。下面将为大家详细介绍相关方法。#t#
我们可以直接实现Ruby向对象发送消息:
- class HelloWorld
- def say(name)
- print "Hello, ", name
- end
- end
- hw = HelloWorld.new
- 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方法只需要提供一个比较方法:
x.send(sym) <=> y.send(sym) 通过send得到person的属性值,然后在使用<=>比较。
以上就是Ruby向对象发送消息的一些方法技巧讲解。