- 类的定义:
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end
- 类里面的initialize函数和C++里面的constructor的作用是一样的,当一个对象在new之后,就会调用initialize函数。
- 类里面的成员变量(在Ruby里面称为instance variable),使用@作为前缀,如上面的代码那样。
- 类的成员函数可以随时增加,并不一定要写在一个地方。
- 类的继承使用'<'来表示,如下:
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
end
- 在子类里面覆盖父类的方法时,如果使用super,而不带任何参数的话,那么super就是调用与本方法同名的方法,并传递与本方法相同的参数。
- 当定义类的时候没有明确声明父类的话,ruby隐式把该类的父类定义为Object这个类,所以所有的类都是Object的子类。
- 类的instance variables是对类private的,也就是任何其他的object都不可以直接使用这些变量。然后我们可以通过写accessor来获取这些instance variables。
class Song
def name
@name
end
def artist
@artist
end
def duration
@duration
end
end
# 当然我们也可以通过 attr_reader来同时声明accessor和instance variables.
class Song
attr_reader :name, :artist, :duration # 这里的:name的意思是name这个变量的名字,如果是单单的name的话就表示name的值了。
end
- 相对应的,如果要改变instance variable的值的话,可以声明mutator来实现。
class Song
def duration=(newDuration) # 等号使得该attribute可以用在等号的左边。
@duration = newDuration
end
end
# 相应的也可以用attr_writer来声明
class Song
attr_writer :duration
end
- 在Ruby里面,我们称对于object来说的东西为instance,相对于class来说的东西为class,比如instance variable, class variable。class variable的概念和C++里面的static member variable差不多,而且也是相对于class private的。在名字前面需要加两个,比如 name。
- class method(也就是static function),在定义的时候需要在名字前面增加类名和一个点。
class SongList
MaxTime = 5*60 # 5 minutes
def SongList .isTooLong(aSong)
return aSong.duration > MaxTime
end
end
# 注意,之前使用的new方法其实也是一个class method.
- 可以通过限制method的访问来达到singleton的设计模式。
class Logger
private_class_method :new # 这里的private_class_method就是用来添加私有的method.
@@logger = nil
def Logger.create
@@logger = new unless @@logger
@@logger
end
end
- Ruby里面的access control也是3种:public, protected, private。不同的是,ruby的private是不允许同类的其他实例使用的,也就是如果一个方法是private的话,那么一个对象不可以直接使 用另一个对象的这个方法,即使他们是同一个类的。
- access control在Ruby里面是动态的,而不是像C++那样是静态的在编译的时候就是报错。也就是如果access control出现了错误,那么只会在运行到该代码的地方才会报错。
- access control的方式有两种,而且和传统的静态语言不一样。public, protected, private这几个名字应该是当作函数来看:
class MyClass
def method1 # default is 'public'
#...
end
protected # subsequent methods will be 'protected'
def method2 # will be 'protected'
#...
end
# 上面的protected函数没有参数,那么他就会使接下来的函数定义默认为protected.
public :method1, :method4
protected :method2
private :method3 # 如果是这样的话,那么就是想private传递了参数,这是第2种用法。
- 类里面的初始话函数initialize()是自动为private的。
- 在Ruby里面,变量存放的不是object,而是对象的引用(reference to object)。对象是存在一个object pool里面,多数情况下是在heap里面。这个概念和Java是类似的。
本文介绍了Ruby中类的定义、初始化函数initialize、成员变量(instance variable)、继承、访问控制以及对象引用等核心概念。类的成员函数可动态增加,instance variables使用@前缀并可通过accessor和mutator访问。Ruby的access control分为public, protected, private,且是动态检查的。此外,变量存储的是对象引用,而非对象本身。"
104117088,8760413,深度解析:MobileNets - 实现移动设备上的高效卷积神经网络,"['深度学习', '卷积神经网络', '嵌入式', '移动视觉', '模型优化']
118

被折叠的 条评论
为什么被折叠?



