Ruby中 respond_to? 和 send 的用法
如同其他的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 这两个方法,我们可以构造更灵活和稳定的程序。
分享到:
相关推荐
Beginning_Ruby_From_Novice_to_Professional.pdf
Redmine 搭建 Ruby_Ruby_on_Rails 项目管理系统
SignalFx的Ruby客户端库_Ruby_Shell_下载.zip
ruby_on_rails_3_入门教程(中文)
ruby-build - 编译和安装Ruby
Ruby自动分级器_Ruby_HTML_下载.zip
ruby_1_9_3_stdlib这一份是ruby的标准库,相当于类库
Ruby编程语言_涵盖Ruby 1.8和1.9
在Scala和Ruby中实现的稳定婚姻问题变体_Ruby_Scala_源码_下载.zip
ruby_1_8_6_core_rdocs.tgz 包含ruby的标准库文件 类和方法
Ruby on Rails的respond_to代码类似物对ASP.NET MVC NuGet 项目: 说明 该库为您的控制器提供了类似响应响应的 RoR 扩展方法。 简而言之, RespondTo允许您的操作根据客户端提交的 *HTTP Accept* 标头以不同的...
RUBY on SaaS 高级软件工程第二次作业代码
函数式-确定性-Ruby取笑___下载.zip
ruby_1_9_3_core_rdocs.gz Ruby开发文档
RUBY的经典之作,对其在RAILS下开发写得很详细
ruby_1_9_3_stdlib_rdocs.gz ,Ruby最新开发文档
Ruby_learning_教程-中文版 Ruby 是一种跨平台,面向对象的解释型语言。他是本着简单实用的原则设计出来的
Ruby算法和数据结构。C扩展_Ruby_C_下载.zip
ruby_on_rails 开发者实战 源代码上 1-12章 来之不易啊。仅供学习.