如何實(shí)現(xiàn)Ruby向?qū)ο蟀l(fā)送消息
Ruby語(yǔ)言做為一種解釋型面完全面向?qū)ο蟮哪_本語(yǔ)言,值得我們?nèi)ド钊胙芯?。我們可以利用Ruby向?qū)ο蟀l(fā)送消息。下面將為大家詳細(xì)介紹相關(guān)方法。#t#
我們可以直接實(shí)現(xiàn)Ruby向?qū)ο蟀l(fā)送消息:
- class HelloWorld
- def say(name)
- print "Hello, ", name
- end
- end
- hw = HelloWorld.new
- hw.send(:say,"world")
我們通常使用hw.say("world"),但send可以對(duì)private的方法起作用。 不光如此send可以使程序更加動(dòng)態(tài),下面我們看看一個(gè)例子:
我們定義了一個(gè)類Person,我們希望一個(gè)包含Person對(duì)象的數(shù)組能夠按照Person的任意成員數(shù)據(jù)來(lái)排序?qū)崿F(xiàn)Ruby向?qū)ο蟀l(fā)送消息:
- 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中任何一個(gè)類都可以隨時(shí)打開(kāi)的,這樣可以寫出像2.days_ago這樣優(yōu)美的code,我們打開(kāi)Array,并定義一個(gè)sort_by方法:
- class Array
- def sort_by(sysm)
- self.sort{|x,y| x.send(sym)
<=> y.send(sym)}- end
- end
我們看看運(yùn)行結(jié)果:
- 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]
這個(gè)結(jié)果是如何得到的呢?
其實(shí)除了send外還有一個(gè)地方應(yīng)該注意attr_reader,attr_reader相當(dāng)于定義了name, age,heigh三個(gè)方法,而Array里的sort方法只需要提供一個(gè)比較方法:
x.send(sym) <=> y.send(sym) 通過(guò)send得到person的屬性值,然后在使用<=>比較。
以上就是Ruby向?qū)ο蟀l(fā)送消息的一些方法技巧講解。