所有的东西都是对象
=================================
3.succ # 4
"abc".upcase # "ABC"
[2,1,5,3,4].sort # [1,2,3,4,5]
查看对象的类型:
"abc".class #得到类型为String。等同"abc".type,不过type方法将过期
所有对象都有一个标识其唯一性的整数:
"abc".object_id #等同"abc".id,不过id方法将过期
Ruby的内建类
==================================
Ruby有超过30个的内建类,另外,Ruby是单继承的语言。
new方法是通常用来实例化对象的:
myFile = File.new('my_file.txt','w')
myStr = String.new('hello,ruby')
以上不是必须的,我们可以这样来实例化:
myStr = "hello,ruby"
myNum = 4
Ruby的字符串
===================================
Ruby的字符串是mutable的,它不像java中的字符串(创建后不能更改,相同的字符串维护的是同一个实例)。
a = "hello"
b = "hello"
a.object_id #21627900
b.object_id #21627890
可以看出,同样的字符串,Ruby会生成不同的实例(这样,同样的字符串出现几此,就要占用几倍的内存空间,这也是为什么在rails中,大量采用ruby symbol而不用字符串来作为
hash键来改善性能的原因,具体情况,请google或baidu一下)。不过凡事总有两面性,Ruby的字符串这样设计虽然有它不好的一面,但也有好的一面,对字符串的可操作性就是它
的优点。
str = "abc"
str.gsub(/b/,'xyz') #axyzc
str #abc
str.gsub!(/b/,'xyz') #axyzc
str #axyzc
想要让Ruby字符串变为immutable,可以使用freeze方法
str.freeze
str.gsub!(/b/,'xyz') #会发生错误
Ruby的Modules和Mixins
====================================================
在一个类中使用include,可以把一个module中的方法变为这个类的实例方法;
使用extend,则可以把一个module中的方法变为这个类的类方法:
module MyModule
def test
puts "hello,module!"
end
end
class MyClass
include MyModule
end
MyClass.new.test
#######################
class MyClass2
include MyModule
end
MyClass2::test
load和require:
================================================
load是在当前调用点插入目标文件中的代码或二进制资源,使其在插入点生效。
require和load差不多,只是如果已经装载过的话,则不再作装载。
创建自己的类
=================================================
一个典型的Ruby类的创建:
class MyClass
NAME = "Class Name" # class constant
def initialize # called when object is allocated
@@count += 1
@myvar = 10
end
def MyClass.getcount # class method
@@count # class variable
end
def getcount # instance returns class variable!
@@count # class variable
end
def getmyvar # instance method
@myvar # instance variable
end
def setmyvar(val) # instance method sets @myvar
@myvar = val
end
def myvar=(val) # Another way to set @myvar
@myvar = val
end
end
foo = MyClass.new # @myvar is 10
foo.setmyvar 20 # @myvar is 20
foo.myvar = 30 # @myvar is 30
有四个方法可以用来自动处理实例的数据访问:attr,attr_accessor,attr_reader,attr_writer,它们的参数都是使用symbol。
以上类中的相应数据访问可以使用这样简单的形式来实现:
attr_accessor :myval
(其实它自动生成了myval和myval=两个方法,来获取或设置@myval实例变量)
类的访问控制
==================================================
Ruby的类有private,protected和pulic这三个访问控制级别(类中的方法默认为public,除了initialize方法是private的[它通常被new方法来调用]),使用方法:
1.定义好方法,然后用private :methodname来作控制,如:
class MyClass
def test
"hello,world"
end
private :test
end
2.在方法定义前加private
class MyClass
private
def test
"hello,world"
end
#之后定义的方法都为private,直到出现另外的访问控制方法
end
类的继承:
class ChildClass < SuperClass
end
super是用来访问父类的关键字
alias 可以给方法起别名,如:
class Test
def test
puts "aaaaaaaaa"
end
alias testx test
end
Test.new.testx
方法的可变参数
==================================================
用*定义的参数部分,可以接受不定个数的参数(以Array的形式存放)
def mymethod(a, b, *c)
print a, b
c.each do |x| print x end
end
mymethod(1,2,3,4,5,6,7) # a=1, b=2, c=[3,4,5,6,7]