Ruby 中所有的数据结构和值都是对象,包括基本的数字和字符串以及数组 Array、散列表 Hash 这样的复杂数据结构。
每个对象都能够响应一组特定的 消息,对象能够接收的每个消息都对应一个 方法,方法是一个有名称的、可以被有执行能力的对象触发的可执行程序。
对象也可以使用字面量构造器表示,如字符串使用双引号表示,也开始使用存储了值的变量来表示。消息通过点运算符 .
传递,点右边的消息被传递到点左边的对象上,如 字符串转换为整型时的代码 "10".to_i
,这句代码的意思就是 消息 to_i 被传递给 *字符串对象 "1"*,字符串对象作为消息的接收者被调用,也可以说字符串对象调用了 to_i 方法。
上面提到了两个术语 发送 to_i 消息
和 调用 to_i 方法
,这两个术语并不是完全相同。传递消息给对象时,对象会执行相应的方法,如果对象没有对应的方法则会报错 NoMethodError。
Ruby 的动态特性之一 Ruby 对象可以拦截位置的消息并使他们拥有具体的含义,Rails 框架中大量使用了拦截,发送位置的消息到对象并拦截该消息,然后能够在使用当前数据库表的列名作为动态条件的情况下顺畅运行。
调用方法时也可以携带参数,参数使用 ()
来包含参数,Ruby 对象调用方法时不携带参数可以将 ()
省略。携带参数时 ()
是可选的。
但是对于一些内置函数如 puts,使用 puts 函数输出到 "Hallo" 到控制台:
puts "Hallo"
上述代码中没有显示的消息接收者(对象),但其实是将 "Hallo" 对象发送给了 默认对象 self;并且 "Hallo" 作为参数没有使用 ()
包含,说明在有参数时方法调用也可以省略 ()
。
完整的 Ruby 程序是由对象以及发送给对象的消息组成的。类定义了一组行为或者功能,每一个对象都是类实例化而来的,每一个对象都是不同的。
Ruby 中提供了大量的内置类,如 Integer,String,Array 等,当然也可以编写自定义的类或者给内置类修改或者添加新的功能。
Ruby 中类的概念没有对象重要,Ruby 作为一种动态解释型语言,对象在实例化过程中是可以改变的,对象可以在实例化过程中改变类中定义的行为或者增加原类中没有定义的行为,这就是 Ruby 语言的动态特性。
接下来将编写一个简单的汇率换算的工具,使用 Ruby 的面向对象特性来实现。
使用 RubyMind 创建一个 ruby-tutorial 项目,用来保存 Ruby 代码,在该目录下创建 exchange.rb 文件,并输入如下代码:
# 兑换类
class Exchange
@@yuan_to_aus_rate = 0.2152
def yuan2aus(amount_yuan)
aus = amount_yuan*@@yuan_to_aus_rate
return aus
end
end
ex = Exchange.new
print "输入要兑换的人民币金额(元):"
amount = gets
aus = ex.yuan2aus(amount.to_i)
puts "兑换的澳币金额为(刀):#{aus}"
在上述代码中通过定义一个 Exchange 类并且在类中定义了一个 yuan2aus 方法(行为),通过实例化 Exchange 来调用该方法,通过在键盘输入要转换的金额并调用该方法来实现汇率的换算。
Ruby 程序需要通过 Ruby 解释器来执行,该解释器名为 ruby,在代码文件目录下执行命令:
ruby exchange.rb
输入兑换的人民币金额 2000,输出可兑换的澳币金额为:
输入要兑换的人民币金额(元):2000
兑换的澳币金额为(刀):430.4
ruby 解释器可以检查语法错误,通过添加 -c 参数检查语法错误,*-w* 参数激活高级别的警告,如果语法正确输出如下:
如果语法有错误则会输出具体的错误信息和错误行:
在使用 RubyMine 进行运行程序时只需要选中文件,并点击 Run 该文件即可
如果想要执行时添加参数,可以配置 Run/Debug Configurations:
执行该文件:
在使用 RubyMine 进行编码时,如果出现语法错误 IDE 会提示,无须通过 -cw 来检查语法错误。