美文网首页
ruby中respond_to?和send以及'.

ruby中respond_to?和send以及'.

作者: kamionayuki | 来源:发表于2015-05-27 13:25 被阅读206次

转自:http://selfcontroller.iteye.com/blog/1139556

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

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

obj = Object.new
obj.talk

undefined method 'talk' for #<Object:0x12345678> (NoMethodError)

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

obj = Object.new
if obj.respond_to?("talk")
  obj.talk
else
  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.chomp

if request == "writer"
  puts book.writer
elsif request == "press"
  puts book.press
elseif request == "date"
  puts book.date
.......

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

request = gets.chomp
if book.respond_to?(request)
  puts book.send(request)
else
  puts "Input error"
end

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

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

相关文章

  • ruby中respond_to?和send以及'.

    转自:http://selfcontroller.iteye.com/blog/1139556 如同其他的OO语言...

  • ruby respond_to?

    今日开发遇到respond_to? 顾详细解析下 参考stackoverflow里面的,做了测试 具体真是这个样子...

  • Ruby元编程笔记 - 方法

    Dynamic Method 通过send()去动态调用方法: 在Ruby2.2.2中,send()依然可以调用私...

  • 10 分钟的入门

    函数后面的!和? 反转 转化 数组 打印 赋值 替换 拆分,转化,排序 ruby中的join,split,send...

  • rails 4.2 类级别 respond_to 问题

    在rails 4.2之后的版本中 类方法 respond_with 和 respond_to 已经移到 gem '...

  • 存储过程项目例子

    1.标记发货batch_make_send 2.在标记发货函数中调用的make_send 3.在make_send...

  • Ruby self.send方法

    在看Nginx chunked size exploit代码时,self.send()方法怎么也看不懂,一直以为是...

  • CocoaPods使用总结

    安装准备: 在终端中操作,首先通过3和4检查ruby源和版本 移除现有Ruby默认源gem sources --r...

  • iOS-CocoaPods

    使用 查看是否安装了Ruby和git,ruby -v命令查看Ruby的版本,以及git --version 更新g...

  • cocoapods 使用

    转载文章作者:大象豆豆 在终端中操作,首先通过3和4检查ruby源和版本 移除现有Ruby默认源 gem sour...

网友评论

      本文标题:ruby中respond_to?和send以及'.

      本文链接:https://www.haomeiwen.com/subject/yhprqttx.html