本文不对 Ruby 的基础语法作过多介绍,只对 Ruby 的 OO 运用作出一次实践,也记录了我对 Ruby 的 OO 理解。另外,关于 Ruby 编码规范这里也不再赘述,写的代码尽量遵循《Ruby 编码规范》。
首先,建立一个 Person 类 :
# person.rb
# 定义了一个<code>Person</code>类,该类默认派生于Object类
class Person
# 定义了属性的accessor,封装了属性
attr_accessor :name, :age, :gender, :motherland
# 该方法override了基类的初始化方法
def initialize(name, gender, motherland, age=18)
@name = name;
@age = age;
@gender = gender
@motherland = motherland
end
# 该方法让一个<code>Person<code>对象可以进行“说话”
def talk(content) # 使用带括号的形式
puts content
end
# 该方法让<code>Person</code>对象作自我介绍
def self_introduce # 使用不带括号的形式
puts "My name is " + @name + ", age is " + self.age.to_s # age字段用了self关键字
if @motherland =="China"
puts "I am a Chinese."
else
puts "I am a foreigner."
end
end
end
# 定义了一个<code>Person</code>类,该类默认派生于Object类
class Person
# 定义了属性的accessor,封装了属性
attr_accessor :name, :age, :gender, :motherland
# 该方法override了基类的初始化方法
def initialize(name, gender, motherland, age=18)
@name = name;
@age = age;
@gender = gender
@motherland = motherland
end
# 该方法让一个<code>Person<code>对象可以进行“说话”
def talk(content) # 使用带括号的形式
puts content
end
# 该方法让<code>Person</code>对象作自我介绍
def self_introduce # 使用不带括号的形式
puts "My name is " + @name + ", age is " + self.age.to_s # age字段用了self关键字
if @motherland =="China"
puts "I am a Chinese."
else
puts "I am a foreigner."
end
end
end
从这个类可以感受到弱类型、动态的含义。简洁是Ruby的风格,但过于简洁和灵活的语法可能将给使用该语言的软件工业生产带来负担。所以Ruby是否能作为正式的企业应用开发,目前是不能肯定的。
建立一个学生类:
#student.rb
require 'person' # 引入<code>Person</code>类
# 定义了一个学生(<code>Student</code>)类,该类继承于<code>Person</code>类
class Student < Person
# override基类的方法,添加一段新的介绍
def self_introduce
super # 调用基类的<code>self_introduce</code>方法
puts 'I am a student :-)'
end
end
require 'person' # 引入<code>Person</code>类
# 定义了一个学生(<code>Student</code>)类,该类继承于<code>Person</code>类
class Student < Person
# override基类的方法,添加一段新的介绍
def self_introduce
super # 调用基类的<code>self_introduce</code>方法
puts 'I am a student :-)'
end
end
继承语法极其简练和形象,实现多态、覆写(Override)调用语法的简练,Ruby果真不一般!
下面定义一个模块(Module):
# my_math.rb
# 定义一个用户的数学库模块
module MyMath
# 定义一个求平方根的方法
def sqrt(num, rx=1, e = 1e-10)
num *= 1.0
(num - rx * rx).abs < e ? rx : sqrt(num, (num / rx + rx) / 2, e)
end
end
# 定义一个用户的数学库模块
module MyMath
# 定义一个求平方根的方法
def sqrt(num, rx=1, e = 1e-10)
num *= 1.0
(num - rx * rx).abs < e ? rx : sqrt(num, (num / rx + rx) / 2, e)
end
end
这个类似于C语言中的库函数,在需要的时候引入即可。
最后是测试:
# main.rb
require 'person'
require 'student'
require 'my_math'
person = Person.new("Daniel", "Male", "U.S") # 创建对象
person.self_introduce
me = Student.new("Ding Liang", "Male", "China", 22)
me.self_introduce
# 重定义<code>Student</code>类
class Student
# 该方法让<code>Student</code>可以进行“学习”
def study(subject)
puts "I am studying #{subject}"
end
end
me.study("Ruby")
me.extend(MyMath) # 让这个对象学会了<code>MyMath</code>库里的所有方法
puts me.sqrt(93.1, 25) # 这个对象会使用求平方根的方法了!
require 'person'
require 'student'
require 'my_math'
person = Person.new("Daniel", "Male", "U.S") # 创建对象
person.self_introduce
me = Student.new("Ding Liang", "Male", "China", 22)
me.self_introduce
# 重定义<code>Student</code>类
class Student
# 该方法让<code>Student</code>可以进行“学习”
def study(subject)
puts "I am studying #{subject}"
end
end
me.study("Ruby")
me.extend(MyMath) # 让这个对象学会了<code>MyMath</code>库里的所有方法
puts me.sqrt(93.1, 25) # 这个对象会使用求平方根的方法了!
在这个文件中重定义了Student类,添加了一个study方法给这个类,让其所有的对象都会study了!这相当接近自然中的对象!Ruby语言应该是把类也看作了对象,在运行解释的时候对这个类对象作了修改,这确实是把面向对象发挥到了令一个高度,类的确是对象的啊!跟令我惊奇的是除了类可以修改,创建的当个对象也可以进行定制。如本例中的me对象就让他扩展了数学库,让这个me学生学会了开平方的方法,而其他学生对象可是不会的!
下面是程序的运行结果:
My name is Daniel, age is 18
I am a foreigner.
My name is Ding Liang, age is 22
I am a Chinese.
I am a student :-)
I am studying Ruby
9.64883412646315
I am a foreigner.
My name is Ding Liang, age is 22
I am a Chinese.
I am a student :-)
I am studying Ruby
9.64883412646315
当初Java的反射、内省、序列化等技术和机制已经让我折服,但现在初识Ruby,才感觉正真知道什么是对象,什么是面向对象的程序设计。
呜呼哀哉!
不过回顾“经典”OO理论,设计模式后,发现的确存在一些不足。而Ruby作出了很多创新,让我们的程序更贴近自然,这是一种程序设计的文化和思想。
可惜人类的进步(尤指科学、工业活动)一般都是反自然的,不知道Ruby这个贴近自然的程序设计语言的将来如何。不过不管怎样,他的确是一个很优秀的语言,应该深入学习!
下篇将对RoR在Web应用做个初步实践,同时与基于Spring框架的Java Web应用做个简短的对比。