`
zarknight
  • 浏览: 148226 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ruby way第一章学习【Ruby的动态性】

阅读更多
Ruby是一种动态性相当高的语言,甚至在运行时,我们都可以对对象和类作修改。它可以在即有的静态代码的执行过程中构造生成和计算新的代码片段。

在运行时Coding
=====================================================
我们可以用eval来计算动态组成的表达式:
def calculate(op1, operator, op2)
string = op1.to_s + operator + op2.to_s
eval(string)
end

$alpha = 25
$beta = 12
puts calculate(2, "+", 2) # 4
puts calculate(5, "*", "$alpha") # 125
puts calculate("$beta", "**", 3) # 1728

甚至,我们可以动态定义新的方法或其他代码块:
puts "Method name: "
meth_name = gets.chomp
puts "Line of code: "
line = gets.chomp

string = %[def #{ meth_name} \n #{ line} \n end]
eval(string) # Define the method
eval(meth_name) # Call the method

在不同的平台下我们可能需要对代码所不同的处理,在C语言中,我们使用#ifdef指令来处理这样的问题,但,
那是在编译时作处理的,而Ruby中我们可以这样做:
if platform == Windows
action1
elsif platform == Linux
action2
else
default_action
end
不过上面的做法有些笨拙,因为一个程序中需要判断的地方太多了,从而导致这些判断会运行很多次,所以,
我们可以把上面的代码写成这样:
if platform == Windows
def my_action
action1
end
elsif platform == Linux
def my_action
action2
end
else
def my_action
default_action
end
end
这样,在以后的代码中,只管调用my_action就可以了,不需要再作类似的判断了。


Ruby中的反射
==============================================================
使用defined?关键字用来查看指定的变量名是否已经定义过。
if defined? some_var
print "some_var = #{ some_var} \n"
else
print "The variable some_var is not known.\n"
end

类似的,respond_to?用来查看对象是否存在指定的方法可供调用:
class Test
def test
end
end

a = Test.new
puts a.respond_to?(:test) #true
puts a.respond_to?(:test2) #false

Ruby可以调用对象的type(将过期)或class方法来获取该对象在运行时的类型,另外,可以用is_a?方法
(别名kind_of?)来判断指定对象是否是指定的类型,例如:
print "abc".type # Prints String
print 345.type # Prints Fixnum

rover = Dog.new
print rover.type # Prints Dog
if rover.is_a? Dog
print "Of course he is.\n"
end
if rover.kind_of? Dog
print "Yes, still a dog.\n"
end
if rover.is_a? Animal
print "Yes, he's an animal, too.\n"
end

还有一个方法更绝妙,就是methods方法
(还有些变种方法如private_methods, public_methods),
可以获取一个对象中拥有的所有的方法:
a.methods
a.private_methods

模块有个特别的方法constants用来获取它包含的所有的常量:
module Mod
HELLO = "hello"
WORLD = "world"
end

Mod.constants #HELLO,WORLD

模块有ancestors方法来获取一个模块的父模块:
module Mod
HELLO = "hello"
end

module Mod2
include Mod

WORLD = "world"
end

puts Mod.ancestors #Mod

而类有superclass方法来获取类实例的父类:
class T
end

class Q < T
end

puts Q.superclass #T


当发出一个方法的调用时,比如myobject.mymethod,Ruby查找该方法的顺序是:
1.查找myobject对象是否存在名为mymethod的singleton方法
2.查找myobject对象是否存在名为mymethod的实例方法
3.查找myobject对象的父类中是否存在名为mymethod的方法
这样一圈下来还是找不到的话,Ruby会在类中查找是否定义了method_missing这个方法,如果定义了的话,则会
把mymethod这个方法名(以symbol形式)及本来传给mymethod方法的所有参数作为参数传入method_missing:
class Test
def method_missing(a,p1,p2)
puts "method_missing has done!"
puts "#{ a}-#{ p1}-#{ p2}"
end
end

Test.new.test("aaa","bbb")






 

分享到:
评论

相关推荐

    the ruby way 2ed

    《The Ruby Way 2nd Edition》是一本深入探讨Ruby编程语言的经典著作,旨在帮助读者全面理解和掌握Ruby的精髓。这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大...

    Ruby-Way.rar_About Language

    《Ruby Way》一书还会详细介绍Ruby的Gem包管理器,Gem是Ruby生态系统的核心部分,提供了大量的库和工具,让开发者能够轻松地安装和使用第三方软件包。此外,书中可能涵盖了Ruby on Rails框架,它是基于Ruby构建Web...

    the ruby way

    《The Ruby Way》是一本备受推崇的Ruby编程教程,它以独特的方式深入浅出地介绍了Ruby语言。这本书的核心理念是“如何解决问题”,作者通过实际的编程示例和问题解决策略,帮助读者理解Ruby的强大功能和优雅语法。 ...

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    通过以上内容的详细讲解,《The Ruby Way》第二版为读者提供了全面且深入的Ruby编程知识体系,无论是对于初学者还是有经验的开发者而言,都是一本非常有价值的参考书籍。此外,读者还可以从作者提供的网站...

    ruby中英文api

    "The Ruby Way.chm"则可能是《The Ruby Way》一书的电子版,这是一本深入介绍Ruby编程实践的书籍,它不仅讲解了Ruby的基本语法,还分享了编写高效、简洁Ruby代码的技巧。书中可能包含了大量的示例代码和实践案例,...

    Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm

    《The Ruby Way》第二版是Addison-Wesley出版社在2006年推出的一本深入浅出的Ruby编程语言教程。这本书专为初学者设计,旨在帮助读者快速掌握Ruby语言的基础和高级特性,从而轻松入门Ruby编程。Ruby是一种动态、开放...

    ruby ebook

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)创建。它强调简洁、优雅的语法,以及高效的编程效率。Ruby的灵活性使得开发者能够快速构建复杂的软件系统,同时保持代码的清晰性...

    ruby test document

    书中提到了Ruby on Rails的早期思想受到了第一版《The Ruby Way》中的一些概念的启发,特别是书中现在被称为第11章的内容,这说明了元编程概念在Web框架设计中的深远影响。 《The Ruby Way》提供了对Ruby语言的深入...

    ruby入门书籍

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘于1995年设计并开发。它的设计理念是让编程更加简洁、优雅,同时注重开发者的体验。Ruby在许多方面都与Perl、Python和Smalltalk有相似之处,但它的语法...

    关于ruby的几本电子书

    这里提到的两本书籍——"the ruby way.chm"和"rubyonrails2204.pdf",很可能是关于Ruby语言和Ruby on Rails框架的深入学习资源。 1. "The Ruby Way":这本书通常被看作是Ruby编程的权威指南。它深入探讨了Ruby语言...

    ruby on rails资料

    Ruby是一种面向对象的、动态类型的编程语言,它的设计哲学是简单、直观和生产力。中文教程可以帮助中文使用者更好地理解语言的基本概念,如类、模块、变量、方法、控制流等。Ruby的块、 Proc 和 Lambda 的使用,以及...

    Ruby语言教程&案例&相关项目资源.docx

    - **Learn Ruby the Hard Way**:一本经典书籍,通过练习和项目帮助学习Ruby编程。 #### 教程推荐 1. **Ruby官方文档**:详细的Ruby官方文档,包括语言参考、标准库和教程等。 2. **Ruby Koans**:通过练习题目...

    Ruby语言入门教程

    Ruby语言以其简洁、优雅和高度可扩展性而闻名,它的设计哲学强调使用最少的代码来完成更多的任务,这一点在它的语法中得以体现,被称为“Ruby Way”。 Ruby语言的入门教程将涵盖多个方面,包括编程语言的基本概念、...

    ruby入门书中文版

    解压后,读者可以深入研究Ruby的更多细节,如类和模块的定义,方法的创建与调用,以及元编程(meta-programming)——Ruby允许在运行时修改或创建代码的能力,这是其灵活性的一大体现。 学习Ruby不仅可以提升你的...

    ruby-on-the-way:学习 ruby 和 rails 相关资料

    本资料包“ruby-on-the-way”显然是一份用于学习Ruby和Rails的资源集合,旨在帮助初学者掌握这两项技术。 首先,让我们深入了解Ruby语言的关键特性: 1. 动态类型:Ruby不像Java或C++那样需要提前声明变量的类型,...

Global site tag (gtag.js) - Google Analytics