`
fujinbing
  • 浏览: 237278 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby 中的 respond_to 和send 方法

    博客分类:
  • java
 
阅读更多
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 这两个方法,我们可以构造更灵活和稳定的程序。
分享到:
评论

相关推荐

    hw-ruby-intro.zip_SaaS软件工程_hw-ruby-intro_ruby _ruby 中文_saas

    6. **中文资源**:标签中的“ruby_ ruby__中文”表明这可能是针对中文学习者提供的资料,意味着代码注释、文档或教程可能使用了中文,这对于中文使用者来说是一大便利,能更好地理解和学习Ruby语言和SaaS开发。...

    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`则用于...

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

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

    Ruby-rubybuild编译和安装Ruby

    在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build`来编译和安装Ruby。 `rbenv`是一个用于管理全局或用户级别的Ruby版本的工具,它...

    ruby_1_9_3_core_rdocs

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。...而"ruby_1_9_3_core_rdocs"压缩包中的文档资源,则是开发者深入研究和掌握这一版本的必备参考资料。

    ruby_1_8_6_core_rdocs

    通过阅读“ruby_1_8_6_core_rdocs”的文档,开发者可以深入了解这个版本的 Ruby 如何工作,了解各个类和方法的详细信息,这对于维护旧项目或者研究 Ruby 的历史演变非常有帮助。由于 Ruby 语言的不断进化,理解早期...

    笨办法学ruby_笨办法学ruby_ruby_bravevk4_

    Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的变量,这在函数式编程中尤其有用。 "不墨迹,大量练习"是该教程的一大特点。学习编程不仅仅是理论知识的积累,更重要的是动手实践。书中的每个小节...

    mvc-respond-to:用于 ASP.NET MVC 的 Ruby On Rails respond_to 模拟

    Ruby on Rails的respond_to代码类似物对ASP.NET MVC NuGet 项目: 说明 该库为您的控制器提供了类似响应响应的 RoR 扩展方法。 简而言之, RespondTo允许您的操作根据客户端提交的 *HTTP Accept* 标头以不同的...

    the_ruby_programming_language原版

    《the_ruby_programming_language原版》书籍所附带的介绍性信息,揭示了O'Reilly Media作为一家著名的出版公司,专注于计算机技术和相关领域,出版了多部涉及各种技术的书籍。O'Reilly旗下的资源还包括了《Ruby ...

    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_1_9_3_core_rdocs.gz

    本文将围绕"ruby_1_9_3_core_rdocs.gz"这个压缩包中的核心API,深入探讨Ruby 1.9.3的关键知识点。 1. **对象系统**:Ruby的核心在于其强大的面向对象系统。在Ruby 1.9.3中,一切皆为对象,包括基本类型如整数、字符...

    label_break_ruby_Metaprogramming_

    标题中的"label_break_ruby_Metaprogramming_"暗示我们将讨论如何使用标签(label)和`break`语句在Ruby中实现多层循环的退出。标签是一种在代码中定义特定位置的方法,可以与`break`或`next`语句配合使用,使它们...

    test_logger1.rar_Logger wat_ruby _watir_watir ruby_watir-webdriv

    “Wat_ruby”、“watir”和“ruby_watir”多次提及,这再次强调了Ruby与Watir的紧密关联。Watir库使得开发者能够直接操作网页元素,如点击按钮、填写表单、检查元素的存在等,就像人类用户在浏览网页一样。它提供了...

    Ruby on Rails_ Up and Running

    RUBY的经典之作,对其在RAILS下开发写得很详细

    prototype_oop_javascript_ruby_prototype_

    标题 "prototype_oop_javascript_ruby_prototype_" 暗示了我们将探讨的是关于原型(Prototype)面向对象编程(Object-Oriented Programming, OOP)的概念,主要关注JavaScript和Ruby这两种语言之间的相似性和差异性...

    ruby_on_rails安装部署指导手册

    - 使用 `mkdir /opt/ruby_on_rails` 命令创建安装目录。 - 通过上传工具将软件包上传至 `/opt/ruby_on_rails` 目录下。 - 可以使用 `ll -h` 命令查看上传的文件列表。 #### 四、安装依赖包 ##### 离线安装 - 如果...

    Wit 的 Ruby 库_Ruby_代码_下载

    `wit-ruby`库提供了上传和管理训练数据的接口,开发者可以在Ruby环境中完成模型的训练和优化。 6. **语音识别**: Wit.ai还提供了语音识别功能,`wit-ruby`库可以处理音频流,将其转化为文本,然后进一步进行NLP处理...

    函数式-确定性-Ruby取笑___下载.zip

    Ruby中的Proc和Lambda就是很好的例子,它们可以被当作参数传递,也可以作为方法返回。 3. **函数组合**:通过将两个或更多函数组合起来,创建一个新的函数。Ruby的`.`操作符可以用来链式调用方法,这实际上是一种...

    Ruby_learning_教程-中文版

    文件名和目录名应该全部使用小写,这是因为Ruby中的类和模块命名通常也是小写的。一个简单的Ruby程序如下: ```ruby puts 'hello' ``` 这行代码将会在屏幕上打印出"hello"。Ruby程序的执行是顺序进行的,意味着...

Global site tag (gtag.js) - Google Analytics