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

开发 开发工具
Ruby向对象发送消息对于一个接触Ruby语言不久的人来说还是不好掌握的。希望通过本文介绍的内容可以充分掌握这一方法的应用。

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

我们可以直接实现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向对象发送消息:

  1. class Person   
  2. attr_reader :name,:age,:height   
  3. def initialize(name,age,height)   
  4. @name,@age,@height = name,age,height   
  5. end   
  6. def inspect   
  7. "#@name #@age #@height"   
  8. end   
  9. end  

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

  1. class Array   
  2. def sort_by(sysm)   
  3. self.sort{|x,y| x.send(sym) 
    <=> y.send(sym)}   
  4. end   
  5. end  

我们看看运行结果:

  1. people = []   
  2. people << Person.new("Hansel",35,69)   
  3. people << Person.new("Gretel",32,64)   
  4. people << Person.new("Ted",36,68)   
  5. people << Person.new("Alice", 33, 63)   
  6. p1 = people.sort_by(:name)   
  7. p2 = people.sort_by(:age)   
  8. p3 = people.sort_by(:height)   
  9. p p1 # [Alice 33 63, Gretel 32 
    64, Hansel 35 69, Ted 36 68]   
  10. p p2 # [Gretel 32 64, Alice 33 
    63, Hansel 35 69, Ted 36 68]   
  11. 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向对象发送消息的一些方法技巧讲解。

责任编辑:曹凯 来源: jb51.net
相关推荐

2020-03-27 15:10:23

SpringJava框架

2009-12-14 17:23:31

2009-12-14 10:32:26

Ruby Gnome

2021-03-15 22:42:25

NameNodeDataNode分布式

2009-12-17 14:03:42

Ruby监控网络

2014-09-24 11:32:21

微信企业号开发

2020-08-26 07:17:19

通信

2009-12-15 10:10:42

Ruby过程对象

2009-12-15 13:59:42

Ruby对象操作

2009-12-18 13:49:40

Ruby Watir

2009-07-30 18:50:32

C#发送消息C#应用程序

2024-03-22 12:10:39

Redis消息队列数据库

2009-12-14 11:12:55

Ruby运行

2013-12-11 21:44:01

OpenStack对象Swift

2010-07-20 11:03:45

Telnet会话

2009-04-01 10:41:00

GSMWCDMA的

2009-12-15 14:09:39

Ruby创建可参数化类

2023-12-18 08:36:39

消息队列微服务开发

2009-12-16 14:04:04

Ruby对象初始化

2022-08-02 11:27:25

RabbitMQ消息路由
点赞
收藏

51CTO技术栈公众号