Ruby中 respond_to? 和 send 的用法
来源:互联网 发布:扫地机知乎 编辑:程序博客网 时间:2024/05/05 09:30
原文: http://galeki.is-programmer.com/posts/183.html
如同其他的OO语言一样,在ruby中,通过给对象发送消息,来完成对象的功能,比如 str.upcase ,就是给str发送upcase的消息,点操作符(.),就是用来给对象发送消息的,str接受到消息,然后执行与消息对应的功能。
但是,某些时候,我们并不知道对象能响应哪些消息,比如下面的代码就会产生错误:
obj = Object.new
obj.talk
undefined method ‘talk’ for # (NoMethodError)
因为obj对象没法响应talk这个消息,如果使用 respond_to? 这个方法,就可以实现判断对象能否响应给定的消息了:
obj = Object.newif obj.respond_to?("talk") obj.talkelse puts "Sorry, object can't talk!"end
这样即使obj不能响应talk,也不会使代码产生错误退出,我们也可以应用 respond_to? 方法,根据对象的属性,在程序运行时灵活的控制。
与 respond_to? 相对应,send 方法和点操作符一样,用来给对象发送消息,比如文章开始的 str.upcase ,用 send 可以写成 str.send(“upcase”),它们实现的功能是完全相同的,那么为什么还要用send呢?
这是因为,send 发送的消息,在程序运行时是可变的,我们可以根据不同的输入,动态的向对象发送不同的消息。
比如一个图书管理系统,每本书都有诸如作者、出版社、日期、价钱这些,我们要根据用户的输入查询某本书的属性,如果不用send,我们要对程序的输入做一个一个的测试:
print "Search for: "request = gets.chompif request == "writer" puts book.writerelsif request == "press" puts book.presselseif request == "date" puts book.date......
如果用send方法的话,就简单多了:
request = gets.chompif book.respond_to?(request) puts book.send(request)else puts "Input error"end
这样不用在逐个对用户的输入进行测试,只要查询对象能否相应这个消息,再用send将输入直接发送给对象即可。
通过 respond_to? 和 send 这两个方法,我们可以构造更灵活和稳定的程序。
- Ruby中 respond_to? 和 send 的用法
- Ruby中 respond_to? 和 send 的用法
- Ruby中 respond_to? 和 send 的用法
- Ruby中 respond_to? 和 send 的用法
- Ruby中 respond_to? 和 send 的用法
- Ruby中 respond_to? 和 send 的用法 .
- ruby中的respond_to和send的用法
- Ruby 之 respond_to? 和 send 的用法
- ruby respond_to? 和 send的用法
- Rails中 Send 和respond_to用法
- [Ruby笔记]11.Ruby == .equal? object .object_id .respond_to? .send()
- respond_to and send
- Ruby中yield和block的用法
- ruby中match和scan的用法
- Ruby on Rails 入门 ----respond_to
- Ruby on Rails 入门 ----respond_to
- flex中httpservice的send()用法
- autoit3中有关Send的用法
- 用开源中国(oschina)Git管理代码(整合IntelliJ 13.1.5)
- 浅谈微信卡券功能开发(2)
- 抓取网上图片,并生成缩略图存入本地
- poj3087
- HDU 2089 不要62(数位DP·记忆化搜索)
- Ruby中 respond_to? 和 send 的用法
- Spark1.2集群环境搭建(Standalone+HA) 4G内存5个节点也是蛮拼的
- Andorid消息处理机制
- Spark中文手册-编程指南
- 使用 Drools 规则引擎实现业务逻辑
- 【图论】【桥】【HDU4612】Warm up
- ASP.NET 5 将于2016年一季度发布
- HDU 3555 Bomb (简单数位DP)
- AFNetworking下载网络相关的附件(音视频)等到本地app包中做离线来提高用户体验