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 这两个方法,我们可以构造更灵活和稳定的程序。
分享到:
相关推荐
6. **中文资源**:标签中的“ruby_ ruby__中文”表明这可能是针对中文学习者提供的资料,意味着代码注释、文档或教程可能使用了中文,这对于中文使用者来说是一大便利,能更好地理解和学习Ruby语言和SaaS开发。...
send(before_method, *args) if respond_to?(before_method) original_method.bind(self).call(*args) end end end ``` 在这个实现中,`instance_method`用于获取原始方法的未绑定版本,`define_method`则用于...
SignalFx的Ruby客户端库是为集成SignalFx监控和分析平台而设计的一个开源工具,它允许开发者在Ruby应用程序中轻松地发送指标、事件和日志数据到SignalFx服务。SignalFx是一个实时的大数据智能平台,专注于应用程序...
在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build`来编译和安装Ruby。 `rbenv`是一个用于管理全局或用户级别的Ruby版本的工具,它...
Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。...而"ruby_1_9_3_core_rdocs"压缩包中的文档资源,则是开发者深入研究和掌握这一版本的必备参考资料。
通过阅读“ruby_1_8_6_core_rdocs”的文档,开发者可以深入了解这个版本的 Ruby 如何工作,了解各个类和方法的详细信息,这对于维护旧项目或者研究 Ruby 的历史演变非常有帮助。由于 Ruby 语言的不断进化,理解早期...
Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的变量,这在函数式编程中尤其有用。 "不墨迹,大量练习"是该教程的一大特点。学习编程不仅仅是理论知识的积累,更重要的是动手实践。书中的每个小节...
Ruby on Rails的respond_to代码类似物对ASP.NET MVC NuGet 项目: 说明 该库为您的控制器提供了类似响应响应的 RoR 扩展方法。 简而言之, RespondTo允许您的操作根据客户端提交的 *HTTP Accept* 标头以不同的...
《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_...
本文将围绕"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中实现多层循环的退出。标签是一种在代码中定义特定位置的方法,可以与`break`或`next`语句配合使用,使它们...
“Wat_ruby”、“watir”和“ruby_watir”多次提及,这再次强调了Ruby与Watir的紧密关联。Watir库使得开发者能够直接操作网页元素,如点击按钮、填写表单、检查元素的存在等,就像人类用户在浏览网页一样。它提供了...
RUBY的经典之作,对其在RAILS下开发写得很详细
标题 "prototype_oop_javascript_ruby_prototype_" 暗示了我们将探讨的是关于原型(Prototype)面向对象编程(Object-Oriented Programming, OOP)的概念,主要关注JavaScript和Ruby这两种语言之间的相似性和差异性...
- 使用 `mkdir /opt/ruby_on_rails` 命令创建安装目录。 - 通过上传工具将软件包上传至 `/opt/ruby_on_rails` 目录下。 - 可以使用 `ll -h` 命令查看上传的文件列表。 #### 四、安装依赖包 ##### 离线安装 - 如果...
`wit-ruby`库提供了上传和管理训练数据的接口,开发者可以在Ruby环境中完成模型的训练和优化。 6. **语音识别**: Wit.ai还提供了语音识别功能,`wit-ruby`库可以处理音频流,将其转化为文本,然后进一步进行NLP处理...
Ruby中的Proc和Lambda就是很好的例子,它们可以被当作参数传递,也可以作为方法返回。 3. **函数组合**:通过将两个或更多函数组合起来,创建一个新的函数。Ruby的`.`操作符可以用来链式调用方法,这实际上是一种...
文件名和目录名应该全部使用小写,这是因为Ruby中的类和模块命名通常也是小写的。一个简单的Ruby程序如下: ```ruby puts 'hello' ``` 这行代码将会在屏幕上打印出"hello"。Ruby程序的执行是顺序进行的,意味着...