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、嵌套类

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

(0)

相关推荐

  • ruby的程序结构介绍

    概括.ruby程序由一个或多个ruby源文件组成,源文件由模块组成,模块内部有控制结构.类对象.方法.及表达式等元素,下面就按照这个思路来总结ruby的程序组织结构.  一.源文件  1.1.文件包含   复制代码 代码如下: #file1.rb  inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录  $:.insert(-1,inc_path) #将当前路径加入到load路径数组    require "file2.rb"  re

  • 详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)

    (一) 准备工作 (1) 登录注册 注册账号:这就不谈了,只需要注意使用一个全新的邮箱,别之前注册过公众号小程序等就可以了 https://mp.weixin.qq.com/wxopen/waregister?action=step1 登录账号:通过邮箱密码登录,亦或者绑定微信后使用扫码也是可以的 https://mp.weixin.qq.com/ (2) 获取 APPID 登录后,在开发入门的阶段有一个比较重要的内容需要了解,那就是 APPID,很好理解,就是这个小程序的唯一标识,就类似我们的

  • Go语言的Windows下环境配置以及简单的程序结构讲解

    本地环境设置 在这里我们介绍设置Go编程语言环境,需要在你的计算机上的准备以下两个软件,(A)文本编辑器和(B)Go编译器. 文本编辑器 这将用来键入程序.一些编辑器的例子包括Windows记事本,OS编辑命令,简,Brief, Epsilon, EMACS和VIM或vi. 文本编辑器名称和版本在不同的操作系统可能不太一样.例如,记事本将用于Windows:VIM或vi可以在Windows以及Linux或UNIX上使用. 编辑器创建的文件称为源文件和包含程序源代码.对于围棋程序的源文件通常命名扩

  • SpringBoot快速构建应用程序方法介绍

    首先介绍一下SpringBoot在Coding上的使用场景.Coding中使用SpringBoot搭建的Email服务. 之所以选择SpringBoot,原因就是更加轻量级.在往常的Spring项目中,依赖的库太多,配置太繁杂,用在这只提供Email服务的程序上未免也小题大做了.而SpringBoot提供一些非功能性的常见的大型项目类特性(如内嵌服务器.安全.度量.健康检查.外部化配置)使得我们在部署上也更为方便,如可以直接地内嵌Tomcat/Jetty(不需要单独去部署war包) 1.Spri

  • golang特有程序结构入门教程

    Go语言的由来 ​ Go语言亦叫Golong语言,是由谷歌Goggle公司推出.Go语言的主要开发者有:肯.汤姆逊(Ken Thompson).罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer).这三个都是大神,稍介绍一下他们的贡献: ​ 肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走. ​ 罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多

  • C程序结构的入门

    目录 C Hello World 实例 编译 & 执行 C 程序 在我们学习 C 语言的基本构建块之前,让我们先来看看一个最小的 C 程序结构,在接下来的章节中可以以此作为参考. C Hello World 实例 C 程序主要包括以下部分: 预处理器指令 函数 变量 语句 & 表达式 注释 让我们看一段简单的代码,可以输出单词 "Hello World": 实例 #include <stdio.h> int main() { /* 我的第一个 C 程序 */

  • Java程序结构与常量变量难点解析

    目录 前言 一.java程序结构 二.java程序的运行 1.运行过程 2.JVM是什么? 三.常量与变量 1. 计算机工作原理 2.变量和类型 3.变量的命名规则 4.变量的作用范围 总结 前言 新征程,进入java的学习. 给自己定下一个铁律: 学习,刷题. 一.java程序结构 下面先上一个最简单的java程序: public class HelloWorld{ public static void main(String[] args){ System.out.println("hell

  • Go语言七篇入门教程二程序结构与数据类型

    目录 1. 程序结构 1.1 名称 1.2 声明 1.3 注释 1.4 单双引号 1.5 输出 2. 数据类型 2.1 整型 2.2 浮点型 2.3 复数 2.4 布尔型 2.5 字符串 2.6 常量 2.7 数组 2.8 切片 2.9 map 2.10 结构体 2.11 JSON 3. 流程控制 3.1 条件语句 3.2 选择语句 3.3 循环语句 如何学习Go 1. 程序结构 1.1 名称 如果一个实体名称在函数中声明,它只在函数局部有效.如果声明在函数外,它将对包里面的所有源文件可见. 实

  • 解析C# 程序结构

    目录 C# Hello World 实例 编译 & 执行 C# 程序 在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构,以便作为接下来章节的参考. C# Hello World 实例 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declaration) 一个 class Class 方法 Class 属性 一个 Main 方法 语句(Statements)& 表达式(Expressions) 注释 C# 文件的后缀为 .cs. 以

  • ASP.NET MVC模式中应用程序结构详解

    目录 一.App_Data 二.App_Start 三.Content 四.Controllers 五.font 六.Models 七.Scripts 八.Views 九.Web.config 1.根目录下面的Web.config文件 2.Views文件夹下面的Web.config 十.Global.asax 在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App

随机推荐