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  #if和elsif和后面的代码块必须有换行符或者分号或者then来隔离,else不需要 
  print "num>100\n"   
else   
  print "num<=100\n" #此句执行   
end   
       
print "num<=100\n" if num<=100 #if语句可后置
puts (if num==100;"100";end) #if语句也是表达式所以有返回值

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 then print "num>200"
    print 101 when num>100 
    else print "num<=100" 
end

3.3、循环结构

num=1 
   
while num<5 #反义词until ,和code的分隔符可以是换行符或者分号或者是关键字do
    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、for..in结构

可以对可迭代对象也就是有each方法的对象使用for..in。

hash1={:first=>1,:second=>2,:third=>3}
 
for key,value in hash1
    print key," ",value,"\n"
end

3.5、异常处理

begin #raise产生异常
    1/0
rescue Exception=>ex #给异常起别名
    puts ex.class,ex.message
else
    puts "no exception"
ensure #无论有没有异常必须执行的语句
    puts "must run!"
end

3.6、控制结构补充 

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

四、方法定义

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

4.1、一般方法

def non_para
    puts "this is non_para method"
end
    
def many_para(para1,hash_para,default_para2=2,*dynamic_para3)
    puts "first para is ",para1
    puts "hash para is below:"
    hash_para.each_key{|key|print key,"\t",hash_para[key],"\n"}
    puts "default_para is ",default_para2
    puts "dynamic para is below:"
    for i in dynamic_para3
        print i,","
    end
end
#默认参数和可变参数必须是最后的两个参数
 
non_para()
many_para(1,{:first=>1,:second=>2},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.4、方法补充

        ◆可以undef 方法名取消方法的定义

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

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

五、类及对象

5.1、普通的类定义如下

class Person 
    def initialize(name,age)
        @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 #静态方法,经常也有写成self.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

Ruby01___概述

以Ruby为代表的脚本语言常被用来进行文本处理。为了能对她有个感性认识,我们先给出第一道例题教您使用“grep”命令,其功能就是从文本中找出符合正则表达式的行。grep命令用法如下。grep pattern file...省略文件名时则从标准输入搜索合适的行。若用Ruby(简单地)改写的话,就像下面这样。$pat = ARGV.shiftwhile gets   print i

第四跑道 1472

Ruby

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

ruby,多条执行语句 if 后置

a = [:aa, :bb, :cc, :dd] ele = :unknown a.each do |i| i == :cc and ele = i and break; end # ele = :cc ##################################################### # i == :cc and ele = i and brea...

evan___zhang的博客 401

ruby-2.6.3源码压缩包

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

ruby程序样例

ruby学习最初的几个练习,可以去看看练练手。希望有用

WezTerm终极指南:GPU加速的跨平台终端模拟器与多路复用器

在当今开发者的工具链中,终端模拟器是不可或缺的核心组件。无论是本地开发、远程服务器管理还是复杂的多任务处理,一个高效、灵活的终端工具能显著提升工作效率。WezTerm作为一款GPU加速的跨平台终端模拟器和多路复用器,以其卓越的性能和丰富的功能正在重新定义终端使用体验。这款由Rust语言实现的工具不仅支持Linux、macOS、Windows和FreeBSD等主流操作系统,还提供了原生鼠标支持、连字

gitblog_00819的博客 437

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

Ruby 文件目录操作(实例讲解更易懂)

File 操作 File::atime( path) 返回path的最后访问时间(access time)。 # Ruby [33] pry(main)> File::atime("hello.rb") => 2020-08-15 21:22:51 +0800 # 执行 cat hello.rb 后 # [root@master workspace]# cat hello.rb [34] pry(main)> File::atime("hello.rb") => 20..

Looking的网页备忘录和个人知识库 2360

Ruby on Rails所构建的应用程序基本目录结构总结

Ruby on Rails是Ruby世界中一家独大的Web开发框架,要掌握Rails程序的构建,对其目录结构的了解十分必要,下面就来看一下Ruby on Rails所构建的应用程序基本目录结构总结

告别130MB/s瓶颈!用Zynq+NVMe实现1.2GB/s高速存储的PL数据分流实战

本文详细介绍了如何通过Zynq+NVMe实现1.2GB/s高速存储的PL数据分流方案,突破传统Zynq架构130MB/s的瓶颈。文章分享了PL直连NVMe的硬件架构设计、软件栈优化及性能调优实战技巧,帮助开发者实现高速数据流的稳定存储。

weixin_42653691的博客 372

Ruby编程语言(读书笔记)

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

wuji1626的专栏 1348

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 690

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

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

weixin_34082695的博客 330

干法刻蚀工艺进阶:如何通过调节DC自偏压优化刻蚀速率和各向异性

本文深入探讨了干法刻蚀工艺中DC自偏压的精细调控艺术。DC自偏压是影响刻蚀速率和各向异性的关键因素,文章通过实战案例,详细分析了如何通过调节射频功率、频率、腔室压力及气体成分等参数,间接而有效地控制DC自偏压,从而优化高深宽比硅沟槽等复杂结构的刻蚀效果,实现工艺性能的精准提升。

weixin_28308325的博客 326

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 299

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

Windows防火墙服务异常修复指南:0x80070422与0x6D9报错实战处理

本文针对Windows防火墙服务异常导致的0x80070422与0x6D9报错,提供了从基础到进阶的实战修复指南。核心是通过services.msc服务管理器检查并修复Windows Firewall服务,包括设置启动类型、检查依赖服务等关键步骤。同时介绍了当基础方法失效时,如何使用命令行工具、系统文件检查器(SFC/DISM)以及排查组策略与第三方软件冲突等深度解决方案,帮助用户彻底解决防火墙服务无法启动或访问的问题。

m9n0o的博客 542

Ruby元编程

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

晗的专栏 3201

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪简介 目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。 2.1.1 奥地利 Riegl公司的.

智慧空间实验室 4641

数据分析:蛋白质组的GO term的富集分析详解

在获取差异表达蛋白质的数据之后,依据蛋白质与基因的对应映射关系,开展GO(Gene Ontology)term的富集分析。通过这一分析流程,能够精准地识别出不同实验组中过表达基因所关联的显著富集的GO term通路。这些富集的GO term通路为后续的生物学研究提供了关键线索,有助于深入探究基因功能、揭示潜在的生物学机制,从而推动生物学发现的进程。

专注生信领域 1367

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

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

个人博客 351

【实战圣经】YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

m0_71589036的博客 251

Ruby on Rails

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

weixin_30559481的博客 122

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: wxruby之文本控件
下一篇: 8086编程模型
codesnail
博客等级 码龄18年 113粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值