# Ruby Quick Start (3) -- Module, Mix-in

2016-10-22 10:04:27来源:作者:Yilin's blog人点击

《Ruby语言入门教程v1.0》笔记（3）

puts Math.sqrt(2)# 1.4142135623731puts Math::PI# 3.14159265358979

moduleMedefsqrt(num, rx =1, e =1e -10) num *= 1.0 (num - rx * rx).abs < e ? rx :sqrt(num, (num / rx + rx) /2, e)endendincludeMathputs sqrt(293)# 17.1172427686237# puts sqrt(293, 5, 0.01) 错误，Math模块中的sqrt不存在这种调用方法includeMeputs sqrt(293)# 17.1172427686237puts sqrt(293,5,0.01)# 17.1172429172153

moduleMedefsqrt(num, rx =1, e =1e -10) num *= 1.0 (num - rx * rx).abs < e ? rx :sqrt(num, (num / rx + rx) /2, e)endendmoduleMe2defMe2.sqrt(*num)# 这里参数的星号表示可以接受数组参数"This is text sqrt. "endPI=3.14endputs Math.sqrt(1.23)# 1.10905365064094puts Math::PI# 3.14159265358979puts Me2.sqrt(55,66,77,88,99)# This is text sqrt.puts Me2::PI# 3.14includeMeputs sqrt(456,7,0.01)# 21.3541565188558 3. Ruby中的糅和(Mix-in) 与多重继承

Ruby 本身是单继承，不是通过接口实现多重继承。但是通过 Mix-in模块，可以实现多重继承的优点。

moduleMedefsqrt(num, rx =1, e =1e -10) num *= 1.0 (num - rx*rx).abs <e ? rx :sqrt(num, (num/rx + rx)/2, e)endendclassPersondeftalk puts "I'm talking."endendclassStudent<PersonincludeMeendaStudent = Student.newaStudent.talk # I'm talking.puts aStudent.sqrt(20.7,3.3)# 4.54972526643248

moduleMedefsqrt(num, rx=1, e=1e-10) num*=1.0 (num - rx*rx).abs <e ? rx :sqrt(num, (num/rx + rx)/2, e)endendclassStudentendaStudent = Student.newaStudent.extend(Me)# 为Student类的一个实例aStudent包含Me模块puts aStudent.sqrt(93.1,25)# 9.64883412646315

include方法为一个类的所有对象包含某个模块； extend方法为一个类的某个对象包含某个模块。

4. require 和 load

require"Me"require"Person"classStudent<PersonincludeMeendaStudent = Student.newaStudent.talk # I'm talking.puts aStudent.sqrt(77,2)# 8.77496438739435

require， load用于包含文件； include， extend则用于包含模块。