1.类与对象
1.1 类中的变量
ruby类中的属性全是私有的,不能用private/public/protect来修饰,即便是静态属性也是私有的。外界必须通过类中的方法来访问。
关于实例变(@开头)与局部变量(小写字母与下划线开通)
(1)局部变量的地位相当于java中的普通局部变量
(2)实例变量@不需要声明,这也是ruby的精髓。有时候一个ruby类里面没有定义任何属性,原因就是全都用了实例变量
具体的差异如下面代码所示
class Test
def setdog(i)
@dog=i #实例变量,无需在类中声明
end
def getdog
return @dog
end
def setcat(i)
cat=i #局部变量,没有在类中声明,它只属于这个函数
end
def getcat
return cat
end
end
test=Test.new
test.setdog("mydog")
test.setcat("mycat")
puts test.getdog #正常输出
#puts test.getcat #报错
1.2在类中定义属性
1.2.1普通属性
在ruby中定义一个类的属性有两种方法,一种是通过实例变量(@开通)(不用声明,直接用,如上一节中代码所示),另一种则是通过attr
class Test
attr :vreadonly1 # 只可读
attr_reader :vreadonly2 #只可读
attr_writer :vwrite #可写但不可读
attr_accessor :read_write #可读可写
end
attr :vreadonly1
这行代码,其实是创建了两个方法,Test.vreadonly1 方法和vreadonly1= 方法,这样便让人觉得vreadonly1是plulic
1.2.2静态属性
对于类中的静态属性(相当于java中的static),也有两种定义方法,
方法一:通过@@来定义
class Test
@@monkey="Test类里的oldmonkey" #只有静态变量可以在这样赋值,实例变量不能这样赋值
def getmonkey
return @@monkey
end
def setmonkey(m)
@@monkey=m
end
end
test1=Test.new
test2=Test.new
#puts test.getcat #报错
puts test2.getmonkey
test1.setmonkey("Test类里的newmonkey")
puts test2.getmonkey
输出结果:
Test类里的oldmonkey
Test类里的newmonkey
方法二:用cattr
来定义,但使用cattr之前需要引入require 'active_support/all'
如下面代码所示
require 'active_support/all'
class Test
cattr_accessor :mystatic #可读可写的静态属性
end
Test.mystatic =4
puts Test.mystatic
test=Test.new
puts test.mystatic #在一个对象中也可以调用静态成员,
#因为用cattr_accessor修饰时已经对其进行了封装
#其实是定义了mystatic和mystatic=两个方法
1.2.3静态属性可以在声明时赋默认值,实例属性不可以
class Test
@cat="实例cat"
@@dog="静态dog"
def getcat
return @cat
end
def getdog
return @@dog
end
end
puts "输出结果--"
puts Test.new.getcat
puts Test.new.getdog
输出结果:
输出结果--
静态dog
1.3类中的方法
构造函数:
class Test
def initialize
puts "hello!!"
end
end
Test.new
会输出hello!!
1.2.1public,private,protect
与变量不同,ruby类中的方法默认是公有的,可以用public,private,protect来修饰
1.2.2 静态方法与单例方法
参考了别人的博客https://www.cnblogs.com/yjmyzz/archive/2010/02/19/1669477.html
静态方法
#静态方法的4种写法
class Test
def Test.StaticMethod1
puts "Test.StaticMethod1"
end
def self.StaticMethod2
puts "Test.StaticMethod2"
end
class << Test
def StaticMethod3
puts "Test.StaticMethod3"
end
end
class << self
def StaticMethod4
puts "Test.StaticMethod4"
end
end
end
Test.StaticMethod1
Test.StaticMethod2
Test.StaticMethod3
Test.StaticMethod4
单例方法
#单例方法的2种写法
class Test
def method1
puts "method1"
end
end
t1 = Test.new
def t1.singleMethod1
puts "t1.singleMethod1"
end
class << t1
def singleMethod2
puts "t1.singleMethod2"
end
end
t2 = Test.new
t1.method1
t2.method1
t1.singleMethod1
t1.singleMethod2
#t2.singleMethod1 #将报错
#t2.singleMethod2 #将报错
1.4 ::与.
::可以既可以用来获取方法,又可以用来获取变量
.只可以用来获取变量
2.块
感觉这个介绍很耐人寻味,记录下来:
最后再看一个使用块的例子。我们看一下代码清单 4.4 中的一个测试用例:
test “should get home” do
get static_pages_home_url
assert_response :success
assert_select “title”, “Ruby on Rails Tutorial Sample App”
end
现在不需要理解细节(其实我也不懂),从 do 关键字可以看出,测试的主体其实就是个块。 test 方法的参
数是一个字符串(测试的描述)和一个块,运行测试组件时会执行块中的内容。