`

Ruby中 respond_to? 和 send 的用法 .

 
阅读更多
如同其他的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 这两个方法,我们可以构造更灵活和稳定的程序。







分享到:
评论

相关推荐

    Exercism-exercises-in-Ruby.-ruby.zip

    Exercism_exercises_in_Ruby._ruby.zip Exercism_exercises_in_Ruby._ruby.zip Exercism_exercises_in_Ruby._ruby.zip Exercism_exercises_in_Ruby._ruby.zip Exercism_exercises_in_Ruby._ruby.zip Exercism_...

    Ruby_On_Rails笔记

    Ruby on Rails是一个使用Ruby语言编写的开源Web应用框架,它使用了“约定优于配置”(convention over configuration)的开发哲学,旨在减少代码量和提高开发效率。Rails框架的核心是遵循MVC(模型-视图-控制器)...

    Rails确认替换为SweetAlert_Ruby_HTML_下载.zip

    respond_to do |format| format.js { render 'sweet_alert_confirm' } end end ``` 这里,`sweet_alert_confirm.js.erb`将包含SweetAlert的JavaScript代码来显示确认对话框。 4. **编写JavaScript视图** ...

    SignalFx的Ruby客户端库_Ruby_Shell_下载.zip

    SignalFx的Ruby客户端库是为集成SignalFx监控和分析平台而设计的一个开源工具,它允许开发者在Ruby应用程序中轻松地发送指标、事件和日志数据到SignalFx服务。SignalFx是一个实时的大数据智能平台,专注于应用程序...

    pry-tree:用于撬动的“ tree”命令,显示模块的类层次结构

    显示模块中的类和方法的树。 [1] pry(main)&gt; tree Pry::Helpers Helpers .new .tablify .tablify_or_one_line .tablify_to_screen_width BaseHelpers .colorize_code .heading .jruby_19? .mri_20? .new .safe_...

    Ruby编写的面向行的搜索引擎源码_Ruby_CSS_下载.zip

    Ruby编写的面向行的搜索引擎源码_Ruby_CSS_下载.zip

    ruby_1_9_3_core_rdocs.gz

    10. **Gem生态系统**:Ruby的Gem包管理系统使得第三方库的安装和使用变得极其简单,极大地丰富了Ruby的功能,例如Rails框架、RSpec测试工具等。 总的来说,"ruby_1_9_3_core_rdocs.gz"包含的文档是学习和理解Ruby ...

    ruby_on_rails_创建一个博客项目.doc

    ruby_on_rails_创建一个博客项目.doc

    ruby-2.0.0.648-33.el7_4.x86_64.rpm

    离线安装包,亲测可用

    ruby-1.8.7.352-13.el6.x86_64.rpm

    ruby-1.8.7.352-13.el6.x86_64.rpm ruby-1.8.7.352-13.el6.x86_64.rpm

    Alexa网络信息服务_Ruby_Shell_下载.zip

    2. **Shell脚本**:在Ruby中,可以使用`sh`或者`system`等方法来执行Shell命令,这使得Ruby成为编写系统管理脚本的有效工具。 3. **Alexa API**:如果项目是围绕Alexa网络信息服务,那么开发者可能使用了Alexa的API...

    Ruby-Style-Guide-ruby.zip

    Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_...

    Primer设计系统的ViewComponents_Ruby_CSS_下载.zip

    在Ruby on Rails中,View Components是一种强大的工具,它们与传统的Helper方法不同,因为它们有自己的状态和生命周期。当你在项目中使用View Components时,你可以将复杂的视图逻辑封装起来,使其更容易测试和理解...

    通过OmniAuth设计多种服务_Ruby_CSS_下载.zip

    通过OmniAuth设计多种服务_Ruby_CSS_下载

    使用devise+omniauth进行谷歌身份验证_Ruby_JavaScript_.zip

    在Ruby on Rails应用中,Devise和OmniAuth是两种常用的工具,用于实现用户认证和第三方身份验证。在这个教程中,我们将深入探讨如何利用这两者来实现谷歌身份验证。这将帮助你的用户通过他们的谷歌账户登录,提升...

    ruby_049_3.tar.gz

    这个代码我改了若干处,加个头文件呀,把以前可变参数函数的调用方法修改呀,甚至64位操作系统和32位操作系统中指针值不同等等, 到现在,这个程序也跑不起来。除了 ./ruby -v 较简单,可以执行,而像 ./ruby -e...

    patch_def_ruby_Metaprogramming_Before_

    send(before_method, *args) if respond_to?(before_method) original_method.bind(self).call(*args) end end end ``` 在这个实现中,`instance_method`用于获取原始方法的未绑定版本,`define_method`则用于...

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

Global site tag (gtag.js) - Google Analytics