ruby的程序结构介绍_ruby专题

概括、ruby程序由一个或多个ruby源文件组成,源文件由模块组成,模块内部有控制结构、类对象、方法、及表达式等元素,下面就按照这个思路来总结ruby的程序组织结构。

 一、源文件

 1.1、文件包含
 

复制代码 代码如下:

 #file1.rb 
inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录 
$:.insert(-1,inc_path) #将当前路径加入到load路径数组 
 
require "file2.rb" 
require "file2.rb" #require包含文件只会被导入一次 
 
load "file3.rb" 
load "file3.rb" #每次load都会无条件再次导入文件 
 
 
#file2.rb 
print "file2.rb is included\n"  
 
 
#file3.rb 
print "file3 is included\n"
 

1.2、源文件执行顺序

复制代码 代码如下:

#coding=utf-8   
=begin 
这里是 
多行注释 
=end 
 
END{print "end1\n"}   
END{print "end2\n"}   
#END块的执行顺序与出现顺序相反   
 
print "text\n"   
    
BEGIN{print "begin1\n"}   
BEGIN{print "begin2\n"}   
#BEGIN块的执行顺序与出现顺序相同   
#BEGIN-TEXT-END 
 
#__END__开头的行后面的内容被忽略 
__END__ 
print "no_text\n"

1.3、源文件书写规则

◆大小写敏感
◆换行符后只能有空白符,并且都会被忽略
◆类和模块及常量名要以大写字母开头,变量以小写字母或者unicode开头

二、模块

复制代码 代码如下:

    #module1.rb 
    inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录 
    $:.insert(-1,inc_path) #将当前路径加入到load路径数组 
     
    require "module2.rb" 
     
    print Mymod::VAR1,"\n" 
    Mymod.out 
     
    include Mymod #把Mymod导入到当前名字空间 
    print VAR1 
     
     
    #module2.rb 
    print "module2.rb is included\n" 
     
    module Mymod 
        var1=99  #模块内的变量 
        VAR1=100 #模块内的常量 
         
        print "Mymode is included,var1 is ",var1,"\n" 
         
        def Mymod.out #模块内的方法必须加上模块名 
            print "Mymod.out run\n" 
        end 
    end  

三、控制结构

ruby的控制结构和其他语言一样无非就是顺序,分支及循环,但写法上相当的灵活。

3.1、分支结构之if

复制代码 代码如下:

#if.rb 
num=100   
if (num>200) #可以用unless进行条件取反   
  print "num>200\n"   
elsif num>100   
  print "num>100\n"   
else   
  print "num<=100\n" #此句执行   
end   
     
print "num<=100\n" if num<=100 #if语句可后置,并且if语句本身也是表达式也具有值 
if num<=100 then print "num<100\n" #then可用:替换

3.2、分支结构之case

复制代码 代码如下:

    num=100 
     
    str1=\ 
    case 
        when num>200 then "num>200" 
        when num>100 then "num>100" 
        else "num<=100" #else不使用then 
    end 
     
    print str1,"\n" 
     
     
    case num 
        when 201 : print "num>200"#:和then起到相同的作用 
        print 101 when num>100 
        else print "num<=100" 
    end 

3.3、循环结构

复制代码 代码如下:

    num=1 
     
    while num<5 #反义词until 
        print num 
        num+=1 
    end 
     
    print "\n" 
     
    arr1=[1,2,3,4,5] 
     
    for i in arr1 
        print i 
    end 

复制代码 代码如下:

    num=1 
    loop{ #注意{必须和loop在同一行 
        num+=1 
        next if num==3 #不输出3 
        redo if num==4 #把循环体内此行的前面的语句再执行一遍 
        break if num>5 #大于5则退出循环 
        print num 
    } 
    #输出25 
    #while,until,for也可用next,redo,break 

3.4、控制结构补充

复制代码 代码如下:

    print "0 is true!" #0也是true 
    print "empty string is true!" #""也是true 
    #在ruby中只有nil被判断是false 

四、方法定义

ruby中的方法支持默认参数,可变参数但不支持关键字参数,可以通过传入散列表来模拟实现,方法的最后一句的执行结果就是其返回值。

4.1、一般方法

复制代码 代码如下:

    def non_para 
        print "this is non_para method\n" 
    end 
     
    def many_para(para1,default_para2=2,*dynamic_para3) 
        print "first para is ",para1,"\n" 
        print "default_para is ",default_para2,"\n" 
        for i in dynamic_para3 
            print i,"," 
        end 
    end 
     
    non_para() 
    many_para(1,3,5,7,9) 

4.2、方法的作用范围

ruby根据方法名来确定方法的作用范围,这样做增加了程序的阅读性。

复制代码 代码如下:

    #coding=utf-8 
     
    str1="abcdefg" 
     
    def str1.len #对象的方法 
        puts self.length 
    end 
     
    str1.len 
     
    class Person 
        def Person.info #类的方法即静态方法 
            puts "this is a perosn" 
        end 
    end 
     
    Person.info 

4.3、BLOCK

与方法关联的BLOCK为方法提供了可扩展性。可以把方法中的一部分逻辑抽象成BLOCK独立出来,和子程序调用所不同的是,BLOCK是灵活的,也就是说我可以只完成方法的主干部分,有一些逻辑可以根据需要在调用方法时进行扩展。

复制代码 代码如下:

    def func para1 
        localvalue="local value" 
        yield(para1) 
    end 
     
    func(100){|para1|print "value of para1 is ",para1,"\n"} 
     
    func(100) do |para1| 
    print "double value of para1 is",para1*2,"\n" 
    #print local_value 局部变量已不能被继承 
    end 
    #yield最后一条语句执行结果就是给方法的返回值。 

4.5、方法补充
        ◆可以undef 方法名取消方法的定义

        ◆alias 方法名 方法别名 可以为方法定义不同的名字

        ◆&方法 得到方法的引用,调用时采用 方法引用.call的方式

五、类及对象

5.1、普通的类定义如下

复制代码 代码如下:

    class Person 
        def initialize(name,age)#属性在initialize中定义 
            @name=name 
            @age=age 
        end 
        def name#属性不能直接被访问,必须通过方法接口进行访问 
            @name 
        end 
        def age 
            @age 
        end 
    end 
     
    p1=Person.new("justsong",28)#会用相同的参数调用initialize 
    print p1.name,"\n",p1.age 

5.2、类中方法的访问权限默认为public,ruby有和c++类似的权限声明方式。

复制代码 代码如下:

    class Person 
        def initialize(name,age)#属性在initialize中定义 
            @name=name 
            @age=age 
        end 
        def name#属性不能直接被访问,必须通过方法接口进行访问 
            @name 
        end 
    private#protected,public 
        def age 
            @age 
        end 
    end 
     
    p1=Person.new("justsong",28)#会用相同的参数调用initialize 
    print p1.name,"\n" 
    #print p1.age,private调用将被禁止 

5.3、由于属性必须通过方法接口进行访问,所以在书写程序时有些繁琐,可以采用一下的方法进行简写。

复制代码 代码如下:

    class Person 
        attr_reader :name #具有只读权限 
        attr_writer :age #具有只写权限 
        attr_accessor :country #具有读写权限 
        def initialize(name,age,country) 
            @name=name 
            @age=age 
            @country=country 
        end 
    end 
     
    #其实是ruby自动生成了一些方法 
     
    p1=Person.new("justsong",28,"china")#会用相同的参数调用initialize 
     
    print p1.name,"\n" 
    print p1.country,"\n" 
    #print p1.age,会提示未定义相应方法 

5.4、ruby的类也具有类变量(静态变量)及类方法(静态方法)

复制代码 代码如下:

    class Person 
        attr_reader :name 
        @@country="china" #静态变量 
        def initialize(name) 
            @name=name 
        end 
        def Person.output #静态方法 
            print "country is ",@@country,"\n" 
        end      
    end 
     
    Person.output 
     
    p1=Person.new("zhangsan") 
    p2=Person.new("lisi") 
    print p1.name,"\n",p2.name 

5.5、类的继承

复制代码 代码如下:

    class Person 
        attr_reader :name 
        def initialize(name) 
            @name=name 
        end 
    end 
     
    class Student < Person 
        attr_reader :grade 
        def initialize(name,grade) 
            super(name)#利用super调用父类同名方法 
            @grade=grade 
        end 
    end 
     
    s1=Student.new("justsong",10) 
    print s1.name,"\n",s1.grade 

5.6、嵌套类

直接在类中定义类,或是在类定义时用::指定的类的所属类。

时间: 2024-07-31 23:31:35

ruby的程序结构介绍_ruby专题的相关文章

ruby基本数据类型简明介绍_ruby专题

概括.ruby中的基本数据类型都是类类型,只不过为了书写和阅读的方便,为基本数据类型提供了较为简洁的书写方式而已. 一.数值类型 整数支持二进制,八进制,十进制,十六进制,根据整数的大小动态决定整数是Fixnum类型还是Bignum类型. 浮点数支持科学计数法,小数点后至少有一个数字. 数值类型继承图如下: 复制代码 代码如下: Numeric  |--Integer      |--Fixnum          |--Bignum  |--Float  |--Complex(标准库)  |-

Ruby多线程编程初步入门_ruby专题

 传统程序有一个单独的线程执行,包含该程序的语句或指令顺序执行直到程序终止. 一个多线程的程序有多个线程的执行.在每个线程是按顺序执行的,但是在多核CPU机器上线程可能并行地执行.例如,通常情况下在单一CPU的机器,多个线程实际上不是并行执行的,而是模拟并行交叉的线程的执行. Ruby的可以使用 Thread 类很容易地编写多线程程序. Ruby线程是一个轻量级的和高效的在代码中实现并行性.创建Ruby线程: 要启动一个新线程,关联一个块通过调用Thread.new.将创建一个新的线程执行的代码

使用Ruby来编写访问Twitter的命令行应用程序的教程_ruby专题

简介 Twitter 现已成为社交网络中的佼佼者.Twitter 只允许用户发布不多于 140 个字符的内容,谁能够想到,这个过去毫不起眼的小网站如今却价值十多亿美元,拥有数百万用户,Twitter 平台上已构建了大量的应用程序,并且不断有新的开发人员准备投入这一浪潮中. 本文并不打算介绍 Twitter(事实上,也没有这个必要).相反,本文将介绍如何访问 Twitter 平台来构建出色的命令行应用程序.Twitter 支持各种编程语言,包括 C++.Java?.Perl.Ruby.PHP 和

Ruby简明教程之循环语句介绍_ruby专题

循环结构在编程语言中是不可或缺的,所以Ruby中的循环也有其自定义的规则. 而我们关注循环结构,要知道两个因素:1) 循环的条件:2) 循环执行的内容 Ruby有一些方式来实现循环结构体: 1. times方法 在前面已经有提到过了,语法如下: 复制代码 代码如下: 循环次数.times do                    循环次数.times {       重复执行的动作                          重复执行的动作               end      

Ruby简明教程之数组和Hash介绍_ruby专题

今天学习的是数组和Hash,数组在很多编程语言中都能常常用到. 数组: 数组是存储数据的一种容器,在Ruby中,数组中存储的数据可以是任何类型的数据:这和JAVA不同,在JAVA中,数组是存储同一类型数据的结构. 1. 在Ruby中如何定义数组呢? 使用[ ]来框住元素,而元素之间则使用","间隔.如下, 复制代码 代码如下: name = ["Windy", "Cindy", "Amee", "Tom"]

Ruby中操作文件的方法介绍_ruby专题

 Ruby提供了一套完整的I/O相关的内核模块中实现方法.所有I/O方法来自IO类. 类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 本章将涵盖所有可供在Ruby中使用的基本I/O功能.如需使用更多的功能,请参考Ruby的IO类.puts 语句: 在前面的章节中,你指定值的变量和然后使用声明 puts 输出. puts 把语句指示程序显示存储在变量值.这将添加一个新行,每行末尾写出(输出). 例子: #!/usr

Ruby中的类Google Map/Reduce框架Skynet介绍_ruby专题

Skynet是一个很响亮的名字,因为它是阿诺施瓦辛格主演的经典系列电影<终结者>里面的统治人类的超级计算机网络.不过本文的Skynet没这么恐怖,它是一个ruby版本的Google Map/Reduce框架的名字而已. Google的Map/Reduce框架实在太有名气了,他可以把一个任务切分为很多份,交给n台计算机并行执行,返回的结果再并行的归并,最后得到运算的结果.据说Google一个搜索结果会Map到7000台服务器并行执行,这么多么可怕的分布式运算能力阿!有了Map/Reduce,程序

ruby执行周期性任务的三种gem介绍_ruby专题

1.whenever 首先,whenever是基于linux的cron服务的,所以,在windows平台上没有直接的方法使用该gem.whenever严格来说应该算一个cron的翻译器,将ruby代码翻译为cron脚本,从而将周期性任务转交给cron实际去完成.对于精通cron的shell程序员来说可能不值一提,但对rubyist却不是.首先,我们可以使用ruby语言来书写任务代码,在ruby层面上控制代码,避免了和一些shell脚本的切换:另外,cron命令很强大,但我总是记不住它的命令参数,

Ruby的运算符和语句优先级介绍_ruby专题

Ruby 是一种表达能力很强的语言,这得意于它异常丰富的运算符和语法糖,虽然 Ruby 一直把最小惊讶原则作为它的哲学之一,但还是常常看到让人惊讶不已,难于理解的代码,这可能是因为对它运算符和语句优先级理解不透导致,今天就和大家聊一聊 Ruby 运算符和语句的优先级. 先看一句简单的代码,猜一猜它的输出是什么. 复制代码 代码如下:   puts {}.class 很多人一定以为结果是 Hash,但实事上结果是空,不信可以在 irb 里试一试. 再看一段代码. 复制代码 代码如下: puts "