转自:http://galeki.is-programmer.com/show/183.html
如同其他的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 这两个方法,我们可以构造更灵活和稳定的程序。
分享到:
相关推荐
send(before_method, *args) if respond_to?(before_method) original_method.bind(self).call(*args) end end end ``` 在这个实现中,`instance_method`用于获取原始方法的未绑定版本,`define_method`则用于...
这些文档详细阐述了各个类的方法、用法和示例,是学习和调试Ruby代码的得力助手。通过查阅这些文档,开发者可以深入了解Ruby的内部工作原理,提升编程效率,同时也能更好地利用Ruby的灵活性和强大功能来构建复杂的...
在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build`来编译和安装Ruby。 `rbenv`是一个用于管理全局或用户级别的Ruby版本的工具,它...
SignalFx的Ruby客户端库是为集成SignalFx监控和分析平台而设计的一个开源工具,它允许开发者在Ruby应用程序中轻松地发送指标、事件和日志数据到SignalFx服务。SignalFx是一个实时的大数据智能平台,专注于应用程序...
`来创建动态方法,这是一种在Ruby社区中广泛使用的技巧,尤其是在诸如Rails这样的框架中。 #### 二、`method_missing`详解 `method_missing`是Ruby中的一个特殊方法,它在试图调用一个未定义的方法时被触发。这为...
该gem的核心目的是为核心Ruby框架中缺少的常见Ruby扩展提供快速,非常明显且易于使用的源代码。 常用示例是.blank? 许多项目中常用的方法 .blank? method可能是Ruby核心Ruby库中缺少的重要方法之一,因此应该很...
Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的变量,这在函数式编程中尤其有用。 "不墨迹,大量练习"是该教程的一大特点。学习编程不仅仅是理论知识的积累,更重要的是动手实践。书中的每个小节...
8. **Block**:Ruby 中的代码块是一种特殊的语法结构,通常与迭代器方法一起使用。它们可以用 `{}` 或 `do..end` 定义,并可以通过 `yield` 关键字在方法内部调用。 9. **Gem**:Ruby 的包管理系统,允许开发者分发...
Ruby on Rails的respond_to代码类似物对ASP.NET MVC NuGet 项目: 说明 该库为您的控制器提供了类似响应响应的 RoR 扩展方法。 简而言之, RespondTo允许您的操作根据客户端提交的 *HTTP Accept* 标头以不同的...
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语言的语法、数据类型、控制结构、模块、类和对象、异常处理、文件操作、网络编程、安全性、内置库以及高级主题等。 在标签中提到了“ruby 英文原版”,表明这本书是原版英文...
在Ruby on Rails应用中,Devise和OmniAuth是两种常用的工具,用于实现用户认证和第三方身份验证。在这个教程中,我们将深入探讨如何利用这两者来实现谷歌身份验证。这将帮助你的用户通过他们的谷歌账户登录,提升...
标题中的"label_break_ruby_Metaprogramming_"暗示我们将讨论如何使用标签(label)和`break`语句在Ruby中实现多层循环的退出。标签是一种在代码中定义特定位置的方法,可以与`break`或`next`语句配合使用,使它们...
总的来说,这个资源包提供了学习和实践Ruby自动化测试的一个实例,包括如何使用Logger模块进行日志记录以及如何利用Watir或Watir-Webdriver进行浏览器自动化测试。通过研究这个脚本,你可以深入理解Ruby在自动化测试...
RUBY的经典之作,对其在RAILS下开发写得很详细
10. **Gem生态系统**:Ruby的Gem包管理系统使得第三方库的安装和使用变得极其简单,极大地丰富了Ruby的功能,例如Rails框架、RSpec测试工具等。 总的来说,"ruby_1_9_3_core_rdocs.gz"包含的文档是学习和理解Ruby ...
respond_to do |format| format.js { render 'sweet_alert_confirm' } end end ``` 这里,`sweet_alert_confirm.js.erb`将包含SweetAlert的JavaScript代码来显示确认对话框。 4. **编写JavaScript视图** ...
文件名和目录名应该全部使用小写,这是因为Ruby中的类和模块命名通常也是小写的。一个简单的Ruby程序如下: ```ruby puts 'hello' ``` 这行代码将会在屏幕上打印出"hello"。Ruby程序的执行是顺序进行的,意味着...
在Ruby 1.9.3中,Gem环境的管理和使用对于开发者来说至关重要。 一、Ruby Gem 的基本概念 Ruby Gem 包含了Ruby库、文档、元数据和执行脚本,它们被打包成一个可安装的格式,方便开发者复用和分发代码。Gem 文件通常...