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 这两个方法,我们可以构造更灵活和稳定的程序。
分享到:
相关推荐
总的来说,JS调用Web服务是前端开发中的重要技能,理解并熟练掌握这些知识点,能帮助你构建更加动态和交互性强的网页应用。无论是使用传统的XMLHttpRequest还是现代的fetch API,都能有效地实现客户端与服务器之间的...
7. **HTTPServiceTest**:根据压缩包中的文件名,我们可以推测这个例子可能包含了一个简单的HTTPService测试应用。解压后,查看源代码能更深入地理解如何在实际项目中应用这些概念。 这个例子对于初学者来说非常...
在探讨“ajax二级联动小例子”这一主题时,我们首先需要理解什么是Ajax以及二级联动的概念。Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与...
在ASP.NET中,这通常是一个ASMX或WCF服务,或者是在代码-behind文件中的一个公共方法,标记为 `[WebMethod]` 或 `[ScriptMethod]`,以便于AJAX调用: ```csharp [System.Web.Services.WebMethod] public static ...
在本文中,我们将深入探讨如何使用JavaScript(JS)和AJAX技术来调用Windows Communication Foundation(WCF)服务。WCF是.NET Framework提供的一种全面的服务导向架构,用于构建可互操作的分布式系统。AJAX...
标题“mootools最精简的ajax调用”暗示我们将关注MooTools库中最简洁、最高效的AJAX实现方式。MooTools提供了`Request`类来处理AJAX请求,这使得发起一个简单的AJAX调用变得非常容易。下面我们将详细讨论如何使用`...
在《Ajax入门教程》中,可能包含了一系列经典的小例子,比如: 1. **实时搜索建议**:用户在输入框中输入字符时,利用Ajax动态向服务器发送请求,获取匹配的搜索建议,并即时显示在下拉框中。 2. **无刷新分页**:...
当需要发送请求时,只需调用`HTTPService`对象的`send()`方法: ```actionscript httpService.send(); ``` 5. **处理XML数据**: `handleResult`函数中的`XML(event.result)`会将返回的数据转换为XML对象,你...
当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会在找不到相应方法时被调用,从而提供了一种动态响应未知方法的能力。 `method_missing`的基本...
Ajax是一种在不刷新整个网页的情况下,能够更新部分网页内容的技术,它提高了用户体验,使得网页更加动态和交互。而SOAP是一种基于XML的协议,用于在分布式环境中交换结构化和类型化的信息,常用于Web服务。 标题...
在Ruby中,元编程的一个常见工具是`Module#define_method`,它可以让我们在运行时动态地定义方法。然而,如果我们要实现`def_before`这样的功能,我们需要创建一个可以拦截并控制方法调用的机制。下面我们将深入探讨...
在本小例子中,我们将探讨Ajax的核心原理,以及如何使用GET和POST方法进行数据交互。** ### 1. Ajax基础概念 Ajax的核心是JavaScript对象XMLHttpRequest,它允许JavaScript向服务器发送HTTP请求,并处理服务器返回...
它允许开发者构建动态、交互性强的Web应用,同时支持多种平台,包括Windows、Mac、Linux等。Flex提供了丰富的组件库和强大的数据可视化能力,使得开发者能够构建出具有复杂用户界面的应用。 在Flex中,远程调用是一...
本文将围绕“文件上传例子,upFile”这一主题进行深入探讨,结合提供的标签“upFile”,我们将重点讲解如何实现一个简单的文件上传功能。 首先,文件上传的基本流程包括用户选择文件、前端处理文件、传输文件到...
**Xamarin SignalR入门...以上就是关于Xamarin Android与SignalR集成的基本介绍,通过学习这个简单的例子,你可以理解如何在Xamarin应用中实现即时通讯功能。继续深入实践,你将能够构建出更复杂、功能丰富的实时应用。
JavaScript调用WebService是一种常见的在客户端与服务器之间进行通信的方式,特别是在Web应用中,它允许JavaScript在浏览器端执行一些服务端的功能。本篇文章将探讨如何利用JavaScript来调用WebService中的方法,并...
通过创建XMLHttpRequest对象,设置请求方法、URL、数据等,然后调用`open()`和`send()`方法发起请求。服务器响应后,`onreadystatechange`事件处理程序会接收到数据,通过`responseText`或`responseJSON`属性获取...
下面是一个简单的Ajax校验表单数据的例子: 1. **前端HTML/ASP.NET:** 创建一个简单的表单,包含一个文本框和一个按钮。在文本框的`onblur`事件中触发Ajax请求,按钮则用于提交表单。 ```html ...
要发送请求,调用`request.send()`方法。如果你在创建Request时设置了data参数,这些数据会被自动附带在请求中。 ```javascript request.send(); ``` 3. **处理不同类型的响应**: - **文本**:默认情况下,`...
它的核心是JavaScript对象XMLHttpRequest,通过这个对象,我们可以与服务器进行异步数据交换,使得用户界面更加动态和响应迅速。在本教程中,我们将深入探讨如何利用Ajax实现后台方法调用、传输页面内容、传递数组...