ruby之程序结构

25、Ruby开发:从Gem打包到交互式编程的全面指南 本文是一篇关于Ruby开发的全面指南,重点介绍了如何将Ruby代码打包为Gem进行分发与安装,以及使用交互式Ruby(irb)进行实时编程和调试的技巧。内容涵盖了Ruby程序的结构、Gemspec文件的编写、gem的打包与安装流程、irb的基本使用与高级功能,以及相关的最佳实践与注意事项。通过本文,开发者可以快速掌握RubyGems分发机制和irb的强大功能,提升开发效率。 阅读详情

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

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


Ruby编程实践实验室 本文还有配套的精品资源,点击获取 简介: ruby-lab-code 是一个结合理论与实践的Ruby编程学习资源,提供了代码示例帮助开发者深入理解Ruby的核心概念和技术。资源组织成多个文件夹,每个文件夹对应一篇博客文章,覆盖从基础变量和数据类型到模块和类的使用,再到元编程、错误处理、测试框架等高级主题。学习者可以通过这些代码实例,提升Ruby编程技巧,并熟悉... 阅读详情

相关推荐

Ruby编程:类与实例变量的深入理解

本文深入探讨了Ruby中类定义的机制,包括如何通过self引用当前对象,以及如何在不同情况下追踪当前类。特别关注了class_eval方法,它允许在已存在的类上动态地定义方法。此外,本文还介绍了类实例变量的概念,区分了普通实例变量与类变量,并探讨了它们在Ruby中的行为差异。最后,通过一个实际案例展示了如何使用单例方法来改进代码设计。

weixin_30789053的博客 437

【Ruby】Ruby框架的使用(Ruby on Rails项目结构分析)

目录结构 cc是一个ror项目,所以是按照ror的目录结构来安排的,如下所示。 app:是web应用的主程序目录,包含了mvc组件的代码config:runtime rules,routes,database等的配置db:数据库的schema以及 数据库的migration(数据库的migration就是表示数据库schema更新的脚本,deploy时只需要执行这些脚本就可以做

u010515761的专栏 2221

ruby-2.6.3源码压缩包

最新的ruby源码压缩包,官网下载太慢了,放在这儿下载快一点

【Ruby】Web框架ruby on rails初识(MVC架构初理解)

利用脚手架快速搭建一个有着CRUD功能的网站 我们只需要两条命令,就可以搭建出一个简单的学生管理系统的网站

Janium的博客 2320

Ruby

自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...

以太网硬件核心:MAC、PHY、MII与交换机原理与实战排查

计算机网络通信的基础依赖于一套完整的硬件协议栈。在OSI模型中,数据链路层和物理层是实现设备间可靠、高效数据传输的基石。其核心原理在于将上层数据包封装成帧,并通过特定的介质访问控制与物理信号转换机制进行传输。这一过程的技术价值在于为上层应用提供了透明、稳定的通信信道,是互联网和所有局域网通信的物理承载。在嵌入式系统、网络设备开发及运维等应用场景中,深入理解底层硬件交互至关重要。本文将聚焦于以太网硬件的两大核心组件:负责逻辑成帧与流量控制的MAC控制器,以及负责数模转换与链路协商的PHY芯片。它们通过MII、

dgqvhtlwq472235338的博客 420

娃娃鸭学Ruby-7、文件结构

文件结构的规则 1、如果一个Ruby程序包含有"shebang"注释,那么该注释是第一行。#! 注释 为了指示(Unix类)操作系统如何执行该文件的。 2、如果一个Ruby程序包含一个"coding"注释,而且不包含"shebang"注释,那么该"coding"注释就应该出现在第一行;否则,由于有"shebang"注释必须出现在第一行,所以"coding"注释就只能出现在第二行。 3

娃娃鸭的专栏 137

嵌入式开发面试题全解析:指针、内存、数据类型关键问题总结

本文对嵌入式开发典型面试题进行深度解析,涵盖多方面关键知识。题目 19 揭示字符指针修改字符串常量的错误操作;题目 20 展现strcpy引发的缓冲区溢出风险;题目 21 体现未初始化数组与strlen结合的不可预测性;题目 22 通过位域与对齐规则计算结构体大小;题目 23 因unsigned char溢出导致循环异常。这些题目全面覆盖指针操作、内存管理、数据类型特性等核心内容,精准指出开发中易疏忽的陷阱,有助于理解编程规范,规避风险,提升代码质量与稳定性,是深入掌握嵌入式开发要点的实用指南。

嵌入式中手 1364

rails项目的目录结构

appName/ app/ 用于存放模型、视图和控制器的文件         conifig/ 用于存放配置和数据库连接的参数 config.ru-Rack 服务器配置 db/ 用于存放数据库模式和数据迁移的信息 doc/ 用于存放自动生成的文档 Gemfile 指定了Rails应用程序的包依赖关系 lib/ 用于存放可共享的代码 log/ 用于存放该应用

Talk is cheap,show me the code. 1152

短视频团队架构&工作流程---2025.3.30

1、负责短视频日常内容分发上线,包括视频头图、标题、简介、推荐位及部分内容元数据的日常导入、审核、上线、下线,并提供各品类短视频的内容上线计划表。(20)运营:视频推送后,实时跟进视频数据,定期统计分析数据报表,根据数据表现 找到问题,并发送给各个小组的负责人,对下一期视频内容进行调整。(4)运营:收到成片,设计视频头图、标题、简介、推荐位等,分发到各个平台,统计分析视频的数据,对各个平台的视频进行管理、用户互动等。1、负责影视、戏剧、广告、专题片等的策划、组稿选题、材料收集、内容策划。

超越神明 2151

【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

qq_44703886的博客 3612

Ruby编程语言(读书笔记)

第1章导言 Introduction Ruby是一门纯粹面向对象语言,拥有强大的元编程(metaprogramming)能力,可以用于创建领域特定语言(domain-specific Language DSL)。 1  irb(interactive Ruby)与Ruby交互,在irb提示符下输入任意Ruby表达式,会执行表达式将其值显示出来。 2 ri查看Ruby文

wuji1626的专栏 1348

安卓设备安全相关技术

当前安卓设备使用的加密方案是基于Soc中一块可写入的rom实现,称为熔丝,其结果不可逆。 1、secureboot 2、AVB(Android Verify Boot) 3、dm-verity(device mapper) 4、keymaster 5、crypto 6、rpmb(replay private memory block) 7、TEE(Trust execute environment) 8、SELinux .........

weixin_43797328的博客 4836

STM32CubeMX安装治理:嵌入式AI编程的可信地基

STM32CubeMX是嵌入式开发中连接硬件与软件的关键配置工具,其本质是一个依赖Java运行环境、固件库和XML工程描述的复合型IDE前端。理解其工作原理,需从HAL库生成机制、时钟树计算逻辑及引脚复用映射规则入手——这些底层一致性直接决定AI生成代码能否与真实MCU寄存器行为对齐。在嵌入式AI编程场景下,CubeMX不仅承担初始化代码生成任务,更作为AI Agent推理的结构化知识源(如.ioc文件定义外设拓扑),一旦安装环境存在JRE版本错配、路径编码异常或固件包版本不一致,将导致AI输出与硬件物理层

weixin_34082695的博客 330

闲鱼爬虫实战:模拟手机端破解反爬策略,爬取指定商品搜索数据,爬取闲鱼搜索指定商品(需手机端模拟)o 技术点:抓包分析、cookie与token

技术点作用抓取手机 App 请求,分析 API 结构、Header、参数加密情况requestsPython 中最常用的 HTTP 库,用于发送模拟请求Session 对象自动管理 Cookie,保持会话User-Agent & 设备特征模拟手机型号、系统版本,绕过服务端检测闲鱼部分接口存在签名,需要逆向或复用有效 Token多线程/异步提高爬取效率(需节制,避免封 IP)解析 HTML 或 JSON 数据注意:闲鱼的接口加密程度中等偏上,部分接口存在动态签名(如x-signx-mini-wua。

2201_76125261的博客 712

STM32 USB键盘实现指南

在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。通过上述步骤,您可以在STM32上实现一个功能完整的USB键盘。关键点包括:正确配置USB HID设备实现键盘矩阵扫描处理按键事件并生成HID报告优化按键响应和消抖处理添加额外功能如宏键和LED反馈这个实现可以作为基础,进一步扩展为游戏键盘、宏键盘或特殊输入设备。

suny8的专栏 968

RoR: Ruby On Rails Web Service 3 分发模式

RoR:Web Service 3 分发模式 1:程序结构2、控制器 转载于:https://www.cnblogs.com/mobile/archive/2007/05/14/745860.html

baiduan2016的博客 156

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

Ruby元编程

现在关于Ruby元编程可以说比较热门,这个隐藏在Ruby背后的特性随着大家对Ruby的了解逐渐显现出来啦。这篇文章是自己对Ruby MetPrgamming的理解。 元编程中的元是指元信息(Meta),主要是为其载体提供基本信息,如html页面中就有meta,如content type说明,SEO等。在C++,Java和Ruby语言中,也有元信息概念,如加载到内存中(运行期)的当个对象模型(

晗的专栏 3201

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ruby元编程,基础入门概念理解

现在关于Ruby元编程可以说比较热门,这个隐藏在Ruby背后的特性随着大家对Ruby的了解逐渐显现出来啦。这篇文章是自己对Ruby MetPrgamming的理解。 元编程中的元是指元信息(Meta),主要是为其载体提供基本信息,如html页面中就有meta,如content type说明,SEO等。在C++,Java和Ruby语言中,也有元信息概念,如加载到内存中(运行期)的当个对象模型(

个人博客 351

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Ruby on Rails

Ruby on Rails 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架。 当然了,所有的 web 框架都有同样的目标。是什么使得 Rails 如此不同呢?我们可以通过几个途径来回答这个问题。 第一是看架构。在过去的时间里,许多开发者在严谨的 web 应用程序上使用 MVC 架构。他们发现 MVC 架构可以使他们的程序变得更清晰。(我们将在下一章更详细讨论 MV...

weixin_30559481的博客 122

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Ruby继承的概念和实现

Ruby的继承机制简单而强大,通过。

2501_93569988的博客 263

一个python程序员的ruby三日游(四)——观察者模式

设计模式算是在OO中比较有趣的东西,特别是对于如我之类的用得不是很多的,虽然有时候也会用上,但是并不知道用的是怎样的模式。之前了解了几天的设计模式,实际上也就是将平常经常用到的一些东西进行了总结,如此而已,学习设计模式的另外一个重要的意义在于,我们使用了设计模式的时候我们会知道自己使用了,并且还会知道用了是怎样的设计模式。 至于设计模式这个东西和有些东西一样,是发现的而不是发明的,换句话说,...

白雾霾 79

少就是多

rails A cd A rake db:create:all ruby ruby script\generate scaffold A B:string C:text rake db:migrate 你认为我刚才做了什么?没有了名称的提示,只有A、B、C这样的变量名似的东西,那么这个程序就没意义了吗?给大家充分的讨论时间,然后我说我的看法。做个提示,这个讨论是关于产品化设计,程序结构与需求,也许...

ozzzzzz的专栏 198
上一篇: 物理层及数据链路层
下一篇: c++之基于对象程序设计
codesnail
博客等级 码龄18年 113粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值