`
singleant
  • 浏览: 375321 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【ruby】ruby语言的几个特性总结

    博客分类:
  • ruby
阅读更多

最近在学习ruby,我觉得学习一门语言要先了解语言的基本特性,然后再深入语法、细节特性等。

所以先从ruby语言的特性入手,结合例子简单总结了几点,才真正开始学没多久,绝对不全面,还需后续的学习再补充。

 

 

1.纯面向对象的

在ruby世界里所有的都是对象,包括方法、类、模块。也包括字符、数字、bool等基本类型。
如 
3.times { puts "Hi!" }  #完成三次循环输出
运行结果:
Hi!
Hi!
Hi!

3是一个整型对象,可以直接作为对象调用对象的方法times. 方法的参数是一个函数也是一个对象。
puts "#{'a'.class.superclass}"  
 
类本身也是对象,有成员变量和方法。
这个跟java语言有一些不一样的地方,java有原始基本类型和类之分,对原始基本类型有不一样的处理。

2.动态性、灵活性、弱类型

ruby是动态的编程语言。不需要进行编译,没有编译的过程。所有都是在运行期进行构建的。有点类似js的运行机制。在运行期修改一个类的行为是很简单的。这个和java里通过aop等技术实现简单得多。
例:
class Integer
  def more
    return self+1
  end
end
puts 3.more
puts 4.more
class Integer
  def more
    return self+2
  end
end
puts 3.more
puts 4.more
运行结果:
4
5
6
7
从上面来看 class Integer不代表定义一个新的类,而有可能现成的类,进行结构修改。
给整型增加了一个more方法,同时又在后面修改了more方法的行为。
类可以随时增加、丢弃或修改自己的方法,这个给程序提供了很大的灵活性。弱类型不必多说,不需要给方法写返回类型,定义变量也不需要制定类型,运行期动态识别类型。

3.模块的概念

除了类,ruby还有模块的概念。
模块包含方法集,但是没有实例概念,不能实例化。也可以说模块是无状态的,有点类似静态方法。感觉这个是提供面向过程编程语言的一个特性,就是函数复用。
模块的方法可以很简单的的织入到类里面。
如:
##module test
module A
def add(a,b)
  return a+b
end
end

module B
     def sub(a,b)
       return a-b
     end
end

class Math2
include A
include B
end

ma=Math2.new
sum1=ma.add(3,4)
sum2=ma.sub(7,3)
puts "sum1: #{sum1}"
puts "sum2: #{sum2}"
 
运行结果:
sum1: 7
sum2: 4

以上定义了两个模块,并把模块织如到类里面。织入和继承有区别,感觉就像是组合和继承的差别。

4.强大的反射和元编程

反射就是可以了解类本身的结构,ruby提供和强大的反射技术,这个和java类似。
如:
#reflect
puts "#{'a'.class}"                    #列出字符串类名
puts "#{'a'.class.superclass}"         #列出字符串父类名
puts "#{'a'.class.methods}"            #列出字符串类方法列表
puts "#{'a'.class.instance_methods}"   #列出字符串实例方法列表
  结果:
String
Object
[:try_convert, :allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>, :>=, :to_s, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_instance_methods, :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?, :const_missing, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, :class_variable_defined?, :public_constant, :private_constant, :module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?, :private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method, :autoload, :autoload?, :instance_method, :public_instance_method, :nil?, :=~, :!~, :eql?, :hash, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
[:<=>, :==, :===, :eql?, :hash, :casecmp, :+, :*, :%, :[], :[]=, :insert, :length, :size, :bytesize, :empty?, :=~, :match, :succ, :succ!, :next, :next!, :upto, :index, :rindex, :replace, :clear, :chr, :getbyte, :setbyte, :byteslice, :to_i, :to_f, :to_s, :to_str, :inspect, :dump, :upcase, :downcase, :capitalize, :swapcase, :upcase!, :downcase!, :capitalize!, :swapcase!, :hex, :oct, :split, :lines, :bytes, :chars, :codepoints, :reverse, :reverse!, :concat, :<<, :prepend, :crypt, :intern, :to_sym, :ord, :include?, :start_with?, :end_with?, :scan, :ljust, :rjust, :center, :sub, :gsub, :chop, :chomp, :strip, :lstrip, :rstrip, :sub!, :gsub!, :chop!, :chomp!, :strip!, :lstrip!, :rstrip!, :tr, :tr_s, :delete, :squeeze, :count, :tr!, :tr_s!, :delete!, :squeeze!, :each_line, :each_byte, :each_char, :each_codepoint, :sum, :slice, :slice!, :partition, :rpartition, :encoding, :force_encoding, :valid_encoding?, :ascii_only?, :unpack, :encode, :encode!, :to_r, :to_c, :>, :>=, :<, :<=, :between?, :nil?, :!~, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
[:mymethod, :test_m1, :test_m2, :test_m3, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]

元编程:
可以认为是写生成代码的代码。
以下例子:
#元编程
class TestMeta
def mymethod(n)
puts "in m#{n}"
end
h = {"m1" => 1, "m2" => 2, "m3" => 3}

h.each do |name,index|
define_method("test_#{name}") do
  mymethod(index)
  end
end
end

test=TestMeta.new
puts "#{test.class.instance_methods}"
test.test_m1
test.test_m2
test.test_m3
 
结果:
in m1
in m2
in m3
没有显示为TestMeta类定义test_m1,test_m2,test_m3方法,但是可以直接调用,原因是通过definemethod定义了这个三个方法。


其他特性,等有总结再补。。。
0
0
分享到:
评论

相关推荐

    ruby元编程实际使用实例

    很喜欢ruby元编程,puppet和chef用到了很多ruby的语言特性,来定义一个新的部署语言。 分享几个在实际项目中用到的场景,能力有限,如果有更优方案,请留言给我:) rpc接口模板化——使用eval、alias、defind_method ...

    Ruby元编程小结

    今天被问到此类问题,以前总是觉得这个是比较宽泛的一个概念,自己即使是用过这些特性,但却一直不知道这叫“元编程” 直到今天被人问起的...首先我能想到的自己用过的有这么几个:  1,respond_to?  2,define_meth

    RubyonRails九日学习计划

    第三天 完成《Ruby语言入门教程》,并上机调试 熟悉Ruby语言基本语法和常用函数 第四天 完成《Ruby语言进阶教程》,并上机调试 第五天 按照《应用Rails进行敏捷Web开发.pdf》学习第二部分购物车示例。...

    Git+TortoiseGit+中文语言包 分布式版本控制系统

    如果这个特性不再需要了呢?或者如果在10个提交之后,你发现你做的完全不对呢?分支是这些问题的答案。其他的版本控制系统也有分支,但是Git是第一个让它做好它该做的:快速简单。 8. 潮流 只有死鱼才随波逐流。有...

    高性能 NoSQL 数据库 ArangoDB.zip

    3.Ruby和JS扩展:没有语言范围限制,你可以从前台到后台都使用同一种语言。4.高性能以及低空间占用:ArangoDB比其他nosql都要快,同时占用的空间更小5. 简单易用:可以在几秒内启动并且使用,同时可以通过图形界面来...

    关于PHP常见面试题.pdf

    请列举几个常用的PHP超全局变量。 6. PHP中的面向对象编程(Object-Oriented Programming)是怎样实现的?请简要介绍在PHP中的面向对象编程特性。 7. PHP中的会话管理(Session Management)是什么?请说明如何在PHP...

    正则表达式经典实例中文版 (美)高瓦特斯

    对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误以及完成一些常见的任务,《正则表达式经典实例》给出了涉及基于C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等编程语言的解决方案。...

    Sphinx v3.3.1全文检索引擎 for Windows_支持分布式搜索.zip

    Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建...

    N-blog-master.zip

    使用 Express + MongoDB 搭建多人博客。 有三种方式安装 Node.js:一是通过安装包安装,二是通过源码编译安装,三是在 Linux 下可以通过 yum|apt-get 安装,在 Mac 下可以...查看当前 nrm 内置的几个 npm 源的地址:

    Sphinx全文检索引擎 for Windows v2.0.6

    Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建...

    Sphinx全文检索引擎 for Linux v2.0.6

    Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建...

    Sphinx全文检索引擎 for Windows v2.0.6.zip

    Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建...

    Sphinx全文检索引擎for Linux v2.0.6.rar

    Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。  Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx...

    代码质量管理平台SonarQube

    Java Ruby语言编写的,当前最新版4.4。 功能/特性: 1、通过插件形式,完成各种功能扩展. 2、支持包括Java ,PHP , Python,C#,C/C++, PL/SQL, Cobol, JavaScrip, Groovy等等二十几种编程语言的代码质量管理与检测....

    FCG 架构代码生成器

    下面列出FCG几点特性. &lt;br/&gt;1. FCG采用plugin设计体系,一个具体软件架构的生成器对应一个plugin,等FCG2.0正式版本发布时,你可以登陆到FCG官方网站www.51mda.com.cn或者www.51mda.com下载FCG官方提供的plugin...

    ometa-java:用于 Java 的 OMeta

    OMeta 有几个实现,使用了很多宿主语言,如 JavaScript、Python、Ruby 和 C#。 下面的项目很棒,您可能想看看它们: ,由 ,作者: , 作者 ( ,由 更多信息 如果您需要有关 OMeta 的教程,请查看。 要了解有关...

    java开源包1

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包2

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包3

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

Global site tag (gtag.js) - Google Analytics