Ruby中 respond_to? 和 send 的用法

转载 2007年09月25日 22:15:00

如同其他的OO语言一样,在ruby中,通过给对象发送消息,来完成对象的功能,比如 str.upcase ,就是给str发送upcase的消息,点操作符(.),就是用来给对象发送消息的,str接受到消息,然后执行与消息对应的功能。

但是,某些时候,我们并不知道对象能响应哪些消息,比如下面的代码就会产生错误: 

  1. > obj = Object.new
  2. > obj.talk
  3.  
  4. undefined method 'talk' for #<Object:0x12345678> (NoMethodError)

因为obj对象没法响应talk这个消息,如果使用 respond_to? 这个方法,就可以实现判断对象能否响应给定的消息了:

  1. obj = Object.new
  2. if obj.respond_to?("talk")
  3.    obj.talk
  4. else
  5.    puts "Sorry, object can't talk!"
  6. end

这样即使obj不能响应talk,也不会使代码产生错误退出,我们也可以应用 respond_to? 方法,根据对象的属性,在程序运行时灵活的控制。

与 respond_to? 相对应,send 方法和点操作符一样,用来给对象发送消息,比如文章开始的 str.upcase ,用 send 可以写成 str.send("upcase"),它们实现的功能是完全相同的,那么为什么还要用send呢?

这是因为,send 发送的消息,在程序运行时是可变的,我们可以根据不同的输入,动态的向对象发送不同的消息。

比如一个图书管理系统,每本书都有诸如作者、出版社、日期、价钱这些,我们要根据用户的输入查询某本书的属性,如果不用send,我们要对程序的输入做一个一个的测试:

  1. print "Search for: "
  2. request = gets.chomp
  3.  
  4. if request == "writer"
  5.   puts book.writer
  6. elsif request == "press"
  7.   puts book.press
  8. elseif request == "date"
  9.   puts book.date
  10. ......

如果用send方法的话,就简单多了:

  1. request = gets.chomp
  2.  
  3. if book.respond_to?(request)
  4.   puts book.send(request)
  5. else
  6.   puts "Input error"
  7. end

这样不用在逐个对用户的输入进行测试,只要查询对象能否相应这个消息,再用send将输入直接发送给对象即可。

通过 respond_to? 和 send 这两个方法,我们可以构造更灵活和稳定的程序。

 

相关文章推荐

Ruby中 respond_to? 和 send 的用法

如同其他的OO语言一样,在ruby中,通过给对象发送消息,来完成对象的功能,比如 str.upcase ,就是给str发送upcase的消息,点操作符(.),就是用来给对象发送消息的,str接受到消息...

Ruby中 respond_to? 和 send 的用法

原文: http://galeki.is-programmer.com/posts/183.html如同其他的OO语言一样,在ruby中,通过给对象发送消息,来完成对象的功能,比如 str.upcas...
  • Richar1
  • Richar1
  • 2015年07月22日 15:42
  • 247

线上问题分析:The target server failed to respond(目标服务器返回失败)

The target server failed to respond。问题分析的思路,理解HTTP协议、TCP协议等相当有帮助。...

iOS:开放平台引用(一)--应用外打开app / respond to a custom URL scheme

有时在程序里
  • houseq
  • houseq
  • 2014年10月09日 19:28
  • 3813

JMeter报错the target server failed to respond--JMeter的坑

问题:1、在测试某个http场景时,尤其是设置波动TPS时,出现了报错,是必现错误(压力平稳时却是偶发错误,甚至很少能看到); 每次必现错误(开始一直怀疑是网络或程序的问题) ...

安装调试gitlab/gitlab-ce容器时遇到的502 Whoops, GitLab is taking too much time to respond

最近在实践演练DevOps,需要建立一系列DevOps关键节点,其中在安装Gitlab集中配置中心的时候,发现了一个许多人在安装gitlab会遇到的问题:502 Whoops, GitLab is t...

电子邮件礼仪五大神器 让工作大佬们回复你的邮件 How to get a busy person to respond to your email

五大神器 1) 让你的email尽可能地简短; 2) 格式注重可读性可清晰性; 3) 提问有针对性而非泛泛而谈; 4) 使自己的述求清晰可见; 5) 告诉对方自己也是很牛逼;...

Ruby meta programming 1(binding/send/freeze/remove_method)

#binding #like Dependency Injection in java 10.times{ |i| print("=")} puts("binding") class Demo ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ruby中 respond_to? 和 send 的用法
举报原因:
原因补充:

(最多只允许输入30个字)