类
1.new 实例化对象
ary = Array.new
3. .class查看对象属于哪个类
4. instance_of? 判断对象是否属于某个类
ary = []
str = "Hello world."
p ary.instance_of?(Array)
p str.instance_of?(String)
p ary.instance_of?(String)
p str.instance_of?(Array)
#=> true
#=> true
#=> false
#=> false
5 is_a?
创建类
1.initialize 构造方法
2. @变量: 实例变量
在实例里共用
3.存储器
class HelloWorld
def name
@name
end
def name=(value)
@name = value
end
end
p bob.name #=> "Bob"
bob.name = "Robert" #该语句像是给name赋值 其实是调用name=方法
# 简单的定义存储器
attr_reader :name #只读
attr_writer :name #只写
attr_accessor :name #可以读写
4.self
调用方法时,如果省略了接收者,Ruby 就会默认把 self 作为该方法的接收者。因此,即 使省略了 self,也还是可以调用 name 方法,如下所示。
def greet
print "Hi, I am #{name}."
end
注意,有时候需要显式的使用self,如下:
def test_name
name = "Ruby" # 为局部变量赋值 self.name = "Ruby" # 调用name=方法
end
- 类方法
方法的接受者为类本身的方法, 几种不同的类方法定义方式
class << HelloWorld
def hello(name)
puts "#{name} said hello."
end
end
HelloWorld.hello("John") #=> John said hello.
class HelloWorld
class << self
def hello(name)
puts "#{name} said hello."
end
end
end
def HelloWorld.hello(name)
puts "#{name} said hello."
end
HelloWorld.hello("John") #=> John said hello.
class
def self.hello(name)
puts "#{name} said
end
end
6.常量
class HelloWorld
Version = "1.0"
end
p HelloWorld::Version #=> "1.0"
7.类变量
所有类共用一个变量
class HelloCount
@@count = 0
end
8.方法限制调用
public......以实例方法的形式向外部公开该方法
private......在指定接收者的情况下不能调用该方法(只能使用缺省接收者的方式调用该方法,因此无法从实例的外部访问)
protected......在同一个类中时可将该方法作为实例方法调用
扩展类
1.在原有类基础上添加
class String
def count_word
ary = self.split(/\s+/) # 用空格分割self # 分解成数组
return ary.size # 返回分割后的数组的元素总数
end
end
str = "Just Another Ruby Newbie"
p str.count_word #=> 4
2.继承
super调用父类里 同名的方法
class RingArray < Array
def [](i)
idx = i % size
super(idx)
end
end
如果 没有指定 父类 Ruby 默认指定 Object 为该类的子类.
但是,我们也有可能会希望使用更轻量级的类,而这时就可以使用 BasicObject 类,但是需要指定使用BaseObejct。
alias与undef
1.alias
class C1
def hello
"Hello"
end
end
class C2 < C1
alias old_hello hello
def hello
"#{old_hello}, again"
end
end
obj = C2.new
p obj.old_hello #=> "Hello"
p obj.hello #=> "Hello, again"
2.undef
undef 用于删除已定义的方法。与 alias 一样,参数可以指定方法名或者符号名。
undef 方法名 # 直接使用方法名
undef :方法名 # 使用符号名
例如,在子类中希望删除父类定义的方法时,可以使用 undef。
单例类
通过利用单例类定义, 就可以给对象添加方法(单例方法)。
str1 = "Ruby"
str2 = "Ruby"
class << str1
def hello
"Hello, #{self}!"
end
end
p str1.hello #=> "Hello, Ruby!"
p str2.hello #=>错误(NoMethodError)
到目前为止,我们已经多次只在特定的某个类中添加类方法。Ruby 中所有的类都是 Class 类的对象,因此,Class 类的实例方法以及类对象中所添加的单例方法都是类方法。
网友评论