Ruby语言简介

article/2025/9/11 9:21:02

Ruby是一种解释型、面向对象、动态类型的语言。Ruby采取的策略是在灵活性和运行时安全之间寻找平衡点。随着Rails框架的出现,Ruby也在2006年前后一鸣惊人,同时也指引人们重新找回编程乐趣。尽管从执行速度上说,Ruby谈不上有多高效,但它却能让程序员的编程效率大幅提高。本文将讲述Ruby语言的基础语言特性,包括基本的语法及代码块和类的定义。

 

1. 基础
在Ruby交互命令行中输入以下命令(>>为命令行提示符,=>为返回值;下文将把=>符号和语句写在一行内表明其返回值):

>> puts 'hello, world'
hello, world
=> nil>> language = 'Ruby'
=> "Ruby">> puts "hello, #{language}"
hello, Ruby
=> nil

以上代码使用puts输出,给变量赋值,并用#{}的语法实现字符串替换。这表明Ruby是解释执行的;变量无需声明即可直接初始化和赋值;每条Ruby代码都会返回某个值;单引号包含的字符串表示它将直接被解释,双引号包含的字符串会引发字符串替换。

1.1 编程模型

Ruby是一门纯面向对象语言,在Ruby中一切皆为对象,可以用“.”调用对象具有的方法,可以通过class和methods方法查看对象的类型及支持的方法,如4.class => Fixnum,7.methods => ["inspect", "%", "<<", "numerator", ...],false.class => FalseClass(方括号表示数组)。

1.2 流程控制

条件判断有正常的块形式,也有简单明了的单行形式;除了常见的if语句外,还有unless语句(等价于if not,但可读性更强)。同理,循环也有正常的块形式和单行形式。注意:除了nil和false之外,其他值都代表true,包括0!

# 块形式
if x == 4puts 'This is 4.'
end
# 单行形式
puts 'This is false.' unless true
x = x + 1 while x < 10 # x的结果为10
x = x - 1 until x == 1 # x的结果为1

和其他C家族的语言差不多,Ruby的逻辑运算符and(&&)、or(||)都自带短路功能,若想执行整个表达式,可以用&或|

1.3 鸭子类型

执行4 + 'four'会出现TypeError的错误,说明Ruby是强类型语言,在发生类型冲突时,将得到一个错误。如果把个语句放在def...end函数定义中,则只有在调用函数时才会报错,说明Ruby在运行时而非编译时进行类型检查,这称为动态类型。Ruby的类型系统有自己的潜在优势,即多个类不必继承自相同的父类就能以“多态”的方式使用:

a = ['100', 100.0]
puts a[0].to_i # => 100
puts a[1].to_i # => 100

这就是所谓的“鸭子类型”(duck typing)。数组的第一个元素是String类型,第二个元素是Float类型,但转换成整数用的都是to_i。鸭子类型并不在乎其内在类型是什么,只要一个对象像鸭子一样走路,像鸭子一样嘎嘎叫,那它就是只鸭子。在面向对象设计思想中,有一个重要原则:对接口编码,不对实现编码。如果利用鸭子类型,实现这一原则只需极少的额外工作,就能轻松完成。

1.4 函数

def tell_the_truthtrue
end

每个函数都会返回结果,如果没有显式指定返回值,函数就将退出函数前最后处理的表达式的值返回。函数也是个对象,可以作为参数传给其他函数。

1.5 数组

和Python一样,Ruby的数组也是用中括号来定义,如animals = ['lion', 'tiger', 'bear'];负数下标可以返回倒数的元素,如animals[-1] => "bear";通过指定一个Range对象来获取一个区段的元素,如animals[1..2] => ['tiger', 'bear']。此外,数组元素可以互不相同,多为数组也不过是数组的数组。数组拥有极其丰富的API,可用其实现队列、链表、栈、集合等等。

1.6 散列表

numbers = {2 => 'two', 5 => 'five'}
stuff = {:array => [1, 2, 3], :string => 'Hi, mom!'}
# stuff[:string] => "Hi, mom!"

散列表可以带任何类型的键,上述代码的stuff的键较为特殊——它是一个符号(symbol),前面带有冒号标识符。符号在给事物和概念命名时很好用,例如两个同值字符串在物理上不同,但相同的符号却是同一物理对象,可以通过反复调用'i am string'.object_id和:symbol.object_id来观察。另外,当散列表用作函数最后一个参数时,大括号可有可无,如tell_the_truth :profession => :lawyer。

 

2. 面向对象
2.1 代码块

代码块是没有名字的函数(匿名函数),可以用作参数传递给函数。代码块只占一行时用大括号包起来,占多行是用do/end包起来,可以带若干个参数。

3.times {puts 'hehe'} # 输出3行hehe
['lion', 'tiger', 'bear'].each {|animal| puts animal} # 输出列表的内容

上面的times实际上是Fixnum类型的方法,要自己实现这样一个方法非常容易:

class Fixnumdef my_timesi = selfwhile i > 0i = i - 1yieldendend
end
3.my_times {puts 'hehe'} # 输出3行hehe

这段代码打开一个现有的类,向其中添加一个自定义的my_times方法,并用yield调用代码块。在Ruby中,代码块不仅可用于循环,还可用于延迟执行,即代码块中的行为只有等到调用相关的yield时才会执行。代码块充斥于Ruby的各种库,小到文件的每一行,大到在集合上进行各种复杂操作,都是由代码块来完成的。

2.2 类

调用一个对象的class方法可以查看其类型,调用superclass可以查看这个类型的父类。下图展示了数字的继承链,其中横向箭头表示右边是左边实例化的对象,纵向箭头表示下边继承于上边。Ruby的一切事物都有一个共同的祖先Object。

 

最后通过一个完整的实例——定义一棵树,来看下Ruby的类如何定义和使用,该注意的点都写在注释里面了。

class Tree# 定义实例变量,使用attr或attr_accessor关键字,前者定义变量和访问变量的同名getter方法(即只读),后者定义的变量多了同名setter方法(注意这里使用了符号)attr_accessor :children, :node_name# 构造方法(构造方法必须命名为initialize)def initialize(name, children=[])@node_name = name@children = childrenend# 遍历所有节点并执行代码块block,注意参数前加一个&表示将代码块作为闭包传递给函数def visit_all(&block)visit &blockchildren.each {|c| c.visit_all &block}end# 访问一个节点并执行代码块blockdef visit(&block)block.call selfend
endruby_tree = Tree.new("Ruby", [Tree.new("Reia"),Tree.new("MacRuby")])
# 访问一个节点
ruby_tree.visit {|node| puts node.node_name}
# 访问整棵树
ruby_tree.visit_all {|node| puts "Node: #{node.node_name}"}

再提一下Ruby的命名规范:

(1)类采用CamelCase命名法
(2)实例变量(一个对象有一个值)前必须加上@,类变量(一个类有一个值)前必须加上@@
(3)变量和方法名全小写用下划线命名法,如underscore_style
(4)常量采用全大写下划线命名法,如ALL_CAPS_STYLE
(5)用于逻辑测试的函数和方法一般要加上问号,如if test?

 

3. 模块与混入(Mixin)
面向对象语言利用继承,将行为传播到相似的对象上。若一个对象像继承多种行为,一种做法是用多继承,如C++;Java采用接口解决这一问题,Ruby采用模块Mixin。模块是函数和常量的集合,若在类中包含一个模块,那么该模块的行为和常量也会成为类的一部分。

# 定义模块ToFile
module ToFile# 获取文件名def filename"object_name.txt"end# 创建文件def to_fFile.open(filename, 'w') {|f| f.write(to_s)} # 注意这里to_s在其他地方定义!end
end# 定义用户类
class Personinclude ToFileattr_accessor :namedef initialize(name)@name = nameenddef to_snameend
endPerson.new('matz').to_f # 创建了一个文件object_name.txt,里面包含内容matz

上面的代码很好理解,只是有一点要注意:to_s在模块中使用,在类中实现,但定义模块的时候,实现它的类甚至还没有定义。这正是鸭子类型的精髓所在。写入文件的能力,和Person这个类没有一点关系(一个类就应该做属于它自己的事情),但实际开发又需要把Person类写入文件这种额外功能,这时候mixin就可以轻松胜任这种要求。

Ruby有两个重要的mixin:枚举(enumerable)和比较(comparable)。若想让类可枚举,必须实现each方法;若想让类可比较,必须实现<=>(太空船)操作符(比较a,b两操作数,返回1、0或-1)。Ruby的字符串可以这样比较:'begin' <=> 'end => -1。数组有很多好用的方法:

a = [5, 3, 4, 1]
a.sort => [1, 3, 4, 5] # 整数已通过Fixnum类实现太空船操作符,因此可比较可排序
a.any? {|i| i > 4} => true
a.all? {|i| i > 0} => true
a.collect {|i| i * 2} => [10, 6, 8, 2]
a.select {|i| i % 2 == 0} => [4]
a.member?(2) => false
a.inject {|product, i| product * i} => 60 # 第一个参数是代码块上一次执行的结果,若不设初始值,则使用列表第一个值作为初始值

 

4. 元编程(metaprogramming)
所谓元编程,说白了就是“写能写程序的程序”,这说起来有点拗口,下面会通过实例来讲解。

4.1 开放类

可以重定义Ruby中的任何类,并给它们扩充任何你想要的方法,甚至能让Ruby完全瘫痪,比如重定义Class.new方法。对于开发类来说,这种权衡主要考虑了自由,有这种重定义任何类或对象的自由,就能写出即为通俗易懂的代码,但也要明白,自由越大、能力越强,担负的责任也越重。

class Numericdef inchesselfenddef feetself * 12.inchesenddef milesself * 5280.feetenddef backself * -1enddef forwardselfend
end

上面的代码通过开放Numeric类,就可以像这样采用最简单的语法实现用英寸表示距离:puts 10.miles.back,puts 2.feet.forward。

4.2 使用method_missing

Ruby找不到某个方法时,会调用一个特殊的回调方法method_missing显示诊断信息。通过覆盖这个特殊方法,可以实现一些非常有趣且强大的功能。下面这个示例展示了如何用简洁的语法来实现罗马数字。

class Roman# 覆盖self.method_missing方法def self.method_missing name, *argsroman = name.to_sroman.gsub!("IV", "IIII")roman.gsub!("IX", "VIIII")roman.gsub!("XL", "XXXX")roman.gsub!("XC", "LXXXX")(roman.count("I") +roman.count("V") * 5 +roman.count("X") * 10 +roman.count("L") * 50 +roman.count("C") * 100)end
endputs Roman.III # => 3
puts Roman.XII # => 12

我们没有给Roman类定义什么实际的方法,但已经可以Roman类来表示任何罗马数字!其原理就是在没有找到定义方法时,把方法名称和参数传给method_missing执行。首先调用to_s把方法名转为字符串,然后将罗马数字“左减”特殊形式转换为“右加”形式(更容易计数),最后统计各个符号的个数和加权。

当然,如此强有力的工具也有其代价:类调试起来会更加困难,因为Ruby再也不会告诉你找不到某个方法。因此method_missing是一把双刃剑,它确实可以让语法大大简化,但是要以人为地加强程序的健壮性为前提。

4.3 使用模块

Ruby最流行的元编程方式,非模块莫属。下面的代码讲述如何用模块的方式扩展一个可以读取csv文件的类。

module ActsAsCsv# 只要某个模块被另一模块include,就会调用被include模块的included方法def self.included(base)base.extend ClassMethodsendmodule ClassMethodsdef acts_as_csvinclude InstanceMethodsendendmodule InstanceMethodsattr_accessor :headers, :csv_contentsdef initializereadenddef read@csv_contents = []filename = self.class.to_s.downcase + '.txt'file = File.new(filename)@headers = file.gets.chomp.split(', ') # String的chomp方法去除字符串末尾的回车换行符file.each do |row|@csv_contents << row.chomp.split(', ')endendendend # end of module ActsAsCsvclass RubyCsv  # 没有继承,可以自由添加include ActsAsCsvacts_as_csv
endm = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents.inspect

上述代码中RubyCsv包含了ActsAsCsv,所以ActsAsCsv的included方法中,base就指RubyCsv,ActsAsCsv模块给RubyCsv类添加了唯一一个类方法acts_as_csv,这个方法又打开RubyCsv类,并在类中包含了所有实例方法。如此这般,就写了一个会写程序的程序(通过模块来动态添加类方法)。

一些出色的Ruby框架,如Builder和ActiveRecord,都会为了改善可读性而特别依赖元编程。借助元编程的威力,可以做到尽量缩短正确的Ruby语法与日常用于之间的距离。注意一切都是为了提升代码可读性而服务。

 

5. 总结
Ruby的纯面向对象可以让你用一致的方式来处理对象。鸭子类型根据对象可提供的方法,而不是对象的继承层次,实现了更切合实际的多态设计。Ruby的模块和开放类,使程序员能把行为紧密结合到语法上,大大超越了类中定义的传统方法和实例变量。
核心优势:
(1)优雅的语法和强大的灵活性
(2)脚本:Ruby是一门梦幻般的脚本语言,可以出色地完成许多任务。Ruby许多语法糖可以大幅提高生产效率,各种各样的库和gem(Ruby包)可以满足绝大多数日常需要。
(3)Web开发:很多人学Ruby最终就是为了用Ruby on Rails框架来进行Web开发。作为一个极其成功的MVC框架,其有着广泛的社区支持及优雅的语法。Twitter最初就是用Ruby实现的,借助Ruby无比强大的生产力,可以快速地开发出一个可推向市场的合格产品。
不足之处:
(1)性能:这是Ruby的最大弱点。随着时代的发展,Ruby的速度确实是越来越快。当然,Ruby是创建目的为了改善程序员的体验,在对性能要求不高的应用场景下,性能换来生产效率的大幅提升无疑是值得的。
(2)并发和面向对象编程:面向对象是建立在状态包装一系列行为的基础上,但通常状态是会改变的。程序中存在并发时,这种编程策略就会引发严重问题。
(3)类型安全:静态类型可提供一整套工具,可以更轻松地构造语法树,也因此能实现各种IDE。对Ruby这种动态类型语言来说,实现IDE就困难得多。

 


http://chatgpt.dhexx.cn/article/7tur1q0p.shtml

相关文章

Ruby基本介绍

Ruby 是一种开源的面向对象程序设计的服务器端脚本语言&#xff0c;在 20 世纪 90 年代中期由日本的松本行弘&#xff08;まつもとゆきひろ/Yukihiro Matsumoto&#xff09;设计并开发。在 Ruby 社区&#xff0c;松本也被称为马茨&#xff08;Matz&#xff09;。Ruby 可运行于多…

字典生成----在线密码破解工具hydra和medusa的使用

大家好&#xff0c;我是SuieKa。 本次主要稍微详细分析一下字典的生成和在线密码破解工具hydra和medusa及使用案例&#xff0c;希望对大家学习上有帮助&#xff01; 目录表 一、常见字典生成工具及使用方法1、字典生成工具crunch2、cupp自定义字典3、cewl-根据网站信息生成字典…

入侵AI Medusa 的赛博之海,诚邀#光点2022

未来性 | 突破性 | 跨领域 TEA 新媒体社区发起光点国际新媒体艺术节已经迈入第五年&#xff0c;每年推出的活动板块具前瞻视野&#xff0c;深受赞誉&#xff0c;感谢大家的支持和厚爱。 光点2022国际新媒体艺术节组委会通过 TEA 新媒体社区的力量&#xff0c;打造全球化、合作式…

Medusa学习Medusa参数使用

Medusa学习&&Medusa参数使用 文章目录 Medusa学习&&Medusa参数使用一、Medusa学习二、Medusa参数使用三、我的公众号 一、Medusa学习 Medusa(美杜莎)是一个速度快&#xff0c;支持大规模并行&#xff0c;模块化的爆力破解工具。可以同时对多个主机&#xff0c;…

Medusa和Hydra快速入门手册

Hydra入门使用手册 vanHauser TheHackersChoice http://www.thc.org/thc-hydra 目录 什么是Hydra&#xff1f; Hydra-GTK 如何安装 如何使用Hydra&#xff1f; 参考文档 爆破实例 免责说明 联系我们 防范措施 什么是Hydra&#xff1f; 一个非常快速的网络登录破解程序&#xff…

【kali-密码攻击】(5.1.2)密码在线破解:Medusa

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

Kali 暴力破解--medusa/hydra/xhydra

目录 1 实战-使用 hydra 工具在线破解系统用户密码 2 实战-使用 Medusa 工具在线破解 3 实战-图形化暴力破解软件 xhydra 1 实战-使用 hydra 工具在线破解系统用户密码 2 实战-使用 Medusa 工具在线破解 3 实战-图形化暴力破解软件 xhydra 环境 Kali Centos7(192.168.0.…

密码爆破工具:Medusa(美杜莎)-操作说明

科普下: Medusa是支持AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NCP (NetWare), NNTP, PcAnywhere, POP3, PostgreSQL, rexec, rlogin, rsh, SMB, SMTP (AUTH/VRFY), SNMP, SSHv2, SVN, Telnet, VmAuthd, VNC的密码爆破工具。 最近搞一个项目,需要爆破postgres这个数据库的…

新增X-Helios、X-Medusa算法研究

纯属技术研究&#xff0c;如有侵权&#xff0c;请联系删除 抓个包&#xff0c;在抖音最新的23.7.0版本中&#xff0c;已经新增加了2个参数x-helios&#xff0c;x-medusa 进去解开看了一下,解开得内容和argus得内容相差并不是很大.第一个pb参数从四字节数变成了一段字节串,其他…

Mesa简介

Mesa, also called Mesa3D and The Mesa 3D Graphics Library, is an open source software implementation of OpenGL, Vulkan, and other graphics API specifications. Mesa translates these specifications to vendor-specific graphics hardware drivers. Mesa 实际…

最新版X-Helios、X-Medusa、X-Ladon、X-Argus逆向与风控分析

今天安装新了最新版的某短视频app&#xff08;23.5.0版&#xff09;&#xff0c;发现了一些新的东西 1、新的加密参数X-Helios、X-Medusa 2、新的请求参数 咱们到处逛逛 &#xff0c;看下哪些请求都用了这些请求参数 我们主要关注几个重要的 (1)详情页 (2)列表页 (3) 播放 (…

medusa破解ssh

medusa -h 192.168.3.56 -u priess -P /passwd.txt -M ssh打开kail 输入 即可

Hydra/Medusa爆破工具命令参数和简单操作

1.hydra参数介绍 -l &#xff1a;指定单个用户名称 -L&#xff1a;指定用户名称字典 -p &#xff1a;指定单个密码 -P &#xff1a;指定密码字典 -vV &#xff1a;显示详细的执行过程 -R &#xff1a;根据上一次进度继续破解 -S &#xff1a;使用SSl协议连接 -s &#…

使用kali的medusa工具

实验目的&#xff1a; 练习使用kali的medusa工具 实验环境&#xff1a; 系统&#xff1a;kali CentOs7 kali用户名&#xff1a;kali 密码&#xff1a;kali 靶机用户名&#xff1a;root 密码&#xff1a;123456 实验步骤&#xff1a; 一、通过命令“ip addr”Centos7…

在线密码破解medusa

pw-inspector 按长度和字符集筛选字典 pw-inspector -i /usr/share/wordlists/nmap.lst -o p.lst -l #提取小写字母pw-inspector -i /usr/share/wordlists/nmap.lst -o p.lst -u密码破解效率 密码复杂度&#xff08;字典命中率&#xff09; 带宽、协议、服务器性能、客户端…

Kali-登录暴力破解器工具-medusa使用

medusa是什么&#xff1f; https://www.kali.org/tools/medusa KaliLinux网址对美杜莎机翻&#xff1a; Medusa 旨在成为一个快速、大规模并行、模块化的登录暴力破解器。目标是支持尽可能多的允许远程身份验证的服务。作者认为以下项目是该应用程序的一些关键特性&#xff1a…

密码爆破工具————Medusa(美杜莎)介绍

Medusa&#xff08;美杜莎&#xff09;&#xff0c;开源的软件&#xff0c;kali中有集成。 支持爆破的服务有&#xff1a; AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NCP (NetWare), NNTP, PcAnywhere, POP3, PostgreSQL, rexec, rlogin, rsh, SMB, SMTP (AUTH/VRFY), SNMP, …

密码工具Medusa(美杜莎)参数使用教程

Medusa是一种密码爆破工具&#xff0c;它支持多个协议的爆破&#xff0c;包括FTP、POP3、SSH、Telnet等。其主要特点是速度快&#xff0c;支持多线程操作。下面是Medusa工具的介绍和常用参数&#xff1a; 安装Medusa 在Kali Linux中可以直接使用以下命令进行安装&#xff1a; a…

medusa 使用教程

密码爆破&#xff1a;medusa&#xff08;美杜莎&#xff09;使用方法 1.工具介绍 Medusa工具是通过并行登陆暴力破解的方法&#xff0c;尝试获取远程验证服务访问权限&#xff0c;它支持AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NCP (NetWare),NNTP, PcAnywhere, POP3, P…

Linux Netlink通信

Linux Netlink通信 前言什么是Netlink通信机制那么Netlink有什么优势呢&#xff1f;netlink特点 用户态数据结构msghdrsockaddr_lniovecnlmsghdr 宏定义相关nlmsg_type和nlmsg_flags宏对应解释系统预定义了一系列netlink类型netlink常用宏 用户空间Netlink socket API创建socke…