zoukankan      html  css  js  c++  java
  • 模块全解======>>ruby的类是单继承生物、所以出现了module、实现了多继承

    ruby的类是单继承生物、所以出现了module、实现了多继承、

    注:模块、常量和类的命名都是以大写字母开头

    、 模块引用:
          1、如果引用的模块在同一个文件中,则直接使用模块操作
          2、如果不在同一个文件中,则需要使用require加载被引用模块所在文件。(引用的是完整名称)

    可以使用module包含着各种class、再新建一个类使用include包含各种class、从而实现多重继承、=。 =真是复杂的生物、想简单点觉得变和更复杂了、

    其实modeule不是能够被实例化的、所以只能通过module.method这样来引用方法、当然首先得来一句

    instance_method :fun1 


    Ruby提供了public、protected和private来修饰类成员,其含义与C++相同。但不同的是,在Ruby中,所有类变量都默认 是private的,而类函数都默认是public的。对类成员而言,也可像第4行那样用attr_accessor对其进行修饰,使其可被外部访问。

    类包括多个模块

     1 module Mod1  
    2 def fun1
    3 puts "Mod1::fun1"
    4 end
    5 instance_method :fun1
    6 end
    7 module Mod2
    8 def fun2
    9 puts "Mod2::fun2"
    10 end
    11 instance_method :fun2
    12 end
    13 class Cls
    14 include Mod1
    15 include Mod2
    16 end
    17 obj = Cls.new
    18 obj.fun1
    19 obj.fun2

    模块包含类

     1 module Mod  
    2 def myFunction
    3 puts "myFunction"
    4 end
    5 module_function :myFunction
    6 class Class
    7 def yourFunction
    8 puts "Mod::Class.yourFunction"
    9 end
    10 end
    11 end
    12 Mod.myFunction
    13 object = Mod::Class.new
    14 object.yourFunction


    假如module定义下以下的方法

     1 module MyModule 
    2   GOODMOOD = "happy"
    3   BADMOOD = "grumpy"
    4 def greet
    5 return "I'm #{GOODMOOD}. How are you?"
    6 end
    7 def MyModule.greet
    8 return "I'm #{BADMOOD}. How are you?"
    9 end
    10 end

    其中的MyModule.greet方法、等同于

    1   def self.greet
    2 return "I'm #{BADMOOD}. How are you?"
    3 end

    这里定义的常量可以使用以下方法来访问

    MyModule::GOODMOOD

    某天迩想引用一下greet方法时、可以使用

    MyModule.greet
    

    但是若果迩觉得烦琐、可以先include该模块先

    include MyModule 
    puts( greet )

    注意一下、使用include方法这仅仅只是引用greet方法、而非MyModule.greet、模块自己的方法只能由模块名称引出、无法使用include方法替迩减少些打字的痛苦、

    承接上面的例子、写了一个类、引用上面的模组、没错啦!这就是RUBY多承继承的实现方法 !

    class MyClass
      include MyModule
    
      def sayHi puts
        (greet)
      end
    end
    

    在类中用include包含了上面的模组、好吧、莪们实例化一下

    1 ob = MyClass.new 
    2 ob.sayHi
    3 puts(ob.greet)

    可以惊奇的发现、居然类的实例对象也可以访问模组的实例方法、太神奇了、相当于已经继承了模组的所有方法

    下面再来个多重继承的范例

     1 module MagicThing
    2 attr_accessor :power
    3 end
    4
    5 module Treasure
    6 attr_accessor :value
    7 attr_accessor :owner
    8 end
    9
    10 class Weapon
    11 attr_accessor :deadliness
    12 end
    13
    14 class Sword < Weapon
    15 include Treasure
    16 include MagicThing
    17 attr_accessor :name
    18 end

    从上面看、设置了多个模组、MagicThing和Treasure、还有一个Weapon的类、它们统统都在Sword的继承中实现啦~ 首先Sword继承了Weapon、然后再用include引入了两个模组、所以下面的实现方法是完全成立的!

    1 s = Sword.new
    2 s.name = "Excalibur"
    3 s.deadliness = "fatal"
    4 s.value = 1000
    5 s.owner = "Gribbit The Dragon"
    6 s.power = "Glows when Orcs Appear"

    下面莪们来关注一下模块里头的变量、注意一点、模块里的本地变量是无法被模块外所调用的、甚至是return都不可以、这就是为什么模组内部实例变量满天飞的原因了

     1 x = 1 # local to this program
    2
    3 module Foo
    4 x = 50 # local to module Foo
    5
    6 # This can be mixed in but the variable x won't then be visible
    7 def no_bar
    8 return x
    9 end
    10
    11
    12 def bar
    13 @x = 1000
    14 return @x
    15 end
    16
    17 puts("In Foo: x = #{x}") # this can access the „module local‟ x
    18 end
    19
    20
    21 include Foo
    22
    23 puts(x)
    24 #puts(no_bar) # Error! This can't access the module-local variable
    25 ## needed by the no_bar method
    26 puts(bar)

    可以看到莪已经屏蔽了第24行的代码、因为这个方法是错误的!不能够被调出去、





  • 相关阅读:
    android 数据绑定(6)自定义绑定方法、双向数据绑定
    android apk瘦身(2) R8编译器:压缩代码、压缩资源、优化代码
    Kotlin 泛型
    android 数据绑定(5) kotlin 的binding bug
    android 数据绑定(4)实用特性及疑惑:使用控件、格式化@string/xxx、对象传递、双向数据绑定
    android apk瘦身(1) 使用矢量图 和 webp,去掉多余cpu架构的库文件
    android 数据绑定(3)自动更新UI
    android 数据绑定(2)绑定表达式
    android 数据绑定(1)Ativity、Fragment、Item绑定数据源
    react.js中render的return的坑
  • 原文地址:https://www.cnblogs.com/klobohyz/p/2217305.html
Copyright © 2011-2022 走看看