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 里的几个动态方法 (一),send 方法

浅析 Ruby 里的几个动态方法 (一),send 方法 第一次写技术方面的贴,欢迎拍砖 :) 动态方法,是去控制静态方法的方法,让静态方法的方法名和方法的内容会根据参...
  • sunyllove
  • sunyllove
  • 2016年07月01日 16:08
  • 1631

Ruby函数lambda知识讲解

Ruby语言对于一个刚刚基础编程语言不久的朋友来说,是一个非常陌生的东西。不过,它的出现可以帮助我们快速简便的完成一些功能需求。在这里,我们就为大家介绍其中Ruby函数lambda的一些用法。 ...
  • dazhi_100
  • dazhi_100
  • 2013年10月09日 17:56
  • 1031

ruby sleep函数及常用的方法

1) sleep方法。 ruby中也有定时器,sleep相当于js中的setTimeout函数,不同的是sleep后的参数单位是秒,不是微秒。另外,js中的setTimeout是另起一个线程,不停止主...
  • dazhi_100
  • dazhi_100
  • 2013年11月27日 15:06
  • 7088

Ruby数据类型range用法总结

Range是范围对象的类,定义的时候可以使用范围操作符“..”或者“...”,“..”生成的范围对象包括起点和终点,“...”生成的范围对象不包括终点,范围是由一序列有顺序、有规律的元素对象组成,任何...
  • yongjie2015
  • yongjie2015
  • 2015年10月29日 17:03
  • 275

[Ruby学习总结]Ruby中的Range

Range是范围对象的类,定义的时候可以使用范围操作符“..”或者“...”,“..”生成的范围对象包括起点和终点,“...”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组...
  • tiger435
  • tiger435
  • 2013年03月01日 18:04
  • 1118

socket编程---send函数&recv函数详解

交流学习。。。
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年11月01日 16:27
  • 17932

使用Rubymine的ruby on rails 学习历程②

使用Rubymine的ruby on rails 学习历程②rubymine的官方帮助文档 https://www.jetbrains.com/help/ruby/2016.2/create-and...
  • laxse
  • laxse
  • 2017年01月16日 00:25
  • 379

send 和recv详解

int send( SOCKET s,      const char FAR *buf,      int len,      int flags );   不论是客户还是服务器应用程序都用sen...
  • zorelemn
  • zorelemn
  • 2016年09月17日 22:39
  • 1878

autoit3中有关Send的用法

Send 命令的可用按键列表 快速了解 Send ( "按键" [, 标志] ) 命令。   ^ Ctrl    ! Alt   + Shift    # Win(徽标键) AutoIt ...
  • u012248603
  • u012248603
  • 2016年09月29日 23:35
  • 2154

Ruby String常用函数

1、 单引号中的字符串 单引号的字符串中,连续两个\会被一个\替换 例: ‘nds\\’  #->  nds\ ‘nds\\\’  #-> 出错 ‘nds\\\y’  #->  nds\\y...
  • dazhi_100
  • dazhi_100
  • 2013年07月25日 20:52
  • 8240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ruby中 respond_to? 和 send 的用法
举报原因:
原因补充:

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