`

关于send的小例子,就是动态调用method的简单方式

阅读更多

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

分享到:
评论

相关推荐

    JS调用Web服务完整示例

    总的来说,JS调用Web服务是前端开发中的重要技能,理解并熟练掌握这些知识点,能帮助你构建更加动态和交互性强的网页应用。无论是使用传统的XMLHttpRequest还是现代的fetch API,都能有效地实现客户端与服务器之间的...

    Flex+HTTPService 例子

    7. **HTTPServiceTest**:根据压缩包中的文件名,我们可以推测这个例子可能包含了一个简单的HTTPService测试应用。解压后,查看源代码能更深入地理解如何在实际项目中应用这些概念。 这个例子对于初学者来说非常...

    ajax二级联动小例子

    在探讨“ajax二级联动小例子”这一主题时,我们首先需要理解什么是Ajax以及二级联动的概念。Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与...

    asp.net ajax入门小例子

    在ASP.NET中,这通常是一个ASMX或WCF服务,或者是在代码-behind文件中的一个公共方法,标记为 `[WebMethod]` 或 `[ScriptMethod]`,以便于AJAX调用: ```csharp [System.Web.Services.WebMethod] public static ...

    使用js+ajax调用WCF服务

    在本文中,我们将深入探讨如何使用JavaScript(JS)和AJAX技术来调用Windows Communication Foundation(WCF)服务。WCF是.NET Framework提供的一种全面的服务导向架构,用于构建可互操作的分布式系统。AJAX...

    mootools最精简的ajax调用

    标题“mootools最精简的ajax调用”暗示我们将关注MooTools库中最简洁、最高效的AJAX实现方式。MooTools提供了`Request`类来处理AJAX请求,这使得发起一个简单的AJAX调用变得非常容易。下面我们将详细讨论如何使用`...

    Ajax程序经典小例子,《Ajax入门教程》代码

    在《Ajax入门教程》中,可能包含了一系列经典的小例子,比如: 1. **实时搜索建议**:用户在输入框中输入字符时,利用Ajax动态向服务器发送请求,获取匹配的搜索建议,并即时显示在下拉框中。 2. **无刷新分页**:...

    flex4 httpservice 例子

    当需要发送请求时,只需调用`HTTPService`对象的`send()`方法: ```actionscript httpService.send(); ``` 5. **处理XML数据**: `handleResult`函数中的`XML(event.result)`会将返回的数据转换为XML对象,你...

    Ruby元编程之梦中情人method_missing方法详解

    当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会在找不到相应方法时被调用,从而提供了一种动态响应未知方法的能力。 `method_missing`的基本...

    Ajax调用SOAP-Web示例

    Ajax是一种在不刷新整个网页的情况下,能够更新部分网页内容的技术,它提高了用户体验,使得网页更加动态和交互。而SOAP是一种基于XML的协议,用于在分布式环境中交换结构化和类型化的信息,常用于Web服务。 标题...

    patch_def_ruby_Metaprogramming_Before_

    在Ruby中,元编程的一个常见工具是`Module#define_method`,它可以让我们在运行时动态地定义方法。然而,如果我们要实现`def_before`这样的功能,我们需要创建一个可以拦截并控制方法调用的机制。下面我们将深入探讨...

    ajax小例子

    在本小例子中,我们将探讨Ajax的核心原理,以及如何使用GET和POST方法进行数据交互。** ### 1. Ajax基础概念 Ajax的核心是JavaScript对象XMLHttpRequest,它允许JavaScript向服务器发送HTTP请求,并处理服务器返回...

    felx,jsn远程调用

    它允许开发者构建动态、交互性强的Web应用,同时支持多种平台,包括Windows、Mac、Linux等。Flex提供了丰富的组件库和强大的数据可视化能力,使得开发者能够构建出具有复杂用户界面的应用。 在Flex中,远程调用是一...

    文件上传例子,upFile

    本文将围绕“文件上传例子,upFile”这一主题进行深入探讨,结合提供的标签“upFile”,我们将重点讲解如何实现一个简单的文件上传功能。 首先,文件上传的基本流程包括用户选择文件、前端处理文件、传输文件到...

    Xamarin Signalr入门例子

    **Xamarin SignalR入门...以上就是关于Xamarin Android与SignalR集成的基本介绍,通过学习这个简单的例子,你可以理解如何在Xamarin应用中实现即时通讯功能。继续深入实践,你将能够构建出更复杂、功能丰富的实时应用。

    js调用webservice中的方法实现思路及代码

    JavaScript调用WebService是一种常见的在客户端与服务器之间进行通信的方式,特别是在Web应用中,它允许JavaScript在浏览器端执行一些服务端的功能。本篇文章将探讨如何利用JavaScript来调用WebService中的方法,并...

    springboot+ajax例子

    通过创建XMLHttpRequest对象,设置请求方法、URL、数据等,然后调用`open()`和`send()`方法发起请求。服务器响应后,`onreadystatechange`事件处理程序会接收到数据,通过`responseText`或`responseJSON`属性获取...

    ajax简单例子

    下面是一个简单的Ajax校验表单数据的例子: 1. **前端HTML/ASP.NET:** 创建一个简单的表单,包含一个文本框和一个按钮。在文本框的`onblur`事件中触发Ajax请求,按钮则用于提交表单。 ```html ...

    mootools 例子

    要发送请求,调用`request.send()`方法。如果你在创建Request时设置了data参数,这些数据会被自动附带在请求中。 ```javascript request.send(); ``` 3. **处理不同类型的响应**: - **文本**:默认情况下,`...

    Ajax基本功能实现

    它的核心是JavaScript对象XMLHttpRequest,通过这个对象,我们可以与服务器进行异步数据交换,使得用户界面更加动态和响应迅速。在本教程中,我们将深入探讨如何利用Ajax实现后台方法调用、传输页面内容、传递数组...

Global site tag (gtag.js) - Google Analytics