我们首先来看一段代码
a = "hard workong"
puts a.class
puts a.class.class
puts a.class.superclass
String
Class
Object
class方法查询类的实例对象,比如字符串 a 就为String的实例对象,而 第三行代码,String 属于Class的实例对象 而superclass方法用于查询类的父类,比如String 类就是继承于Object这个类
我们首先来看一段代码
a = "hard workong"
puts a.class
puts a.class.class
puts a.class.superclass
String
Class
Object
class方法查询类的实例对象,比如字符串 a 就为String的实例对象,而 第三行代码,String 属于Class的实例对象 而superclass方法用于查询类的父类,比如String 类就是继承于Object这个类
str1通过dup方法复制String对象,改变str1的值,str2的值不会改变
str1 = "That's a fun day"
str2 = str1
str2 = str1.dup
str2[0] = "t"
puts str1 #=>That's a fun day
puts str2 #=> that's a fun day
arry1 = [ 1, "happy", [1, 2], "name"]
arry2通过dup方法复制arry1,改变arry2的值,arry1不会改变
arry1 = [ "god", "dog", "ant", "ban"]
arry2 = arry1.dup
arry2[1] = "JR"
arry1 # => ["god", "dog", "ant", "ban"]
arry2 # => ["god", "JR", "ant", "ban"]
但是当数组相对来说比较负责时,情况就有所不同
arry1 = [ "god", "dog", [ "ant", "big" ], "ban"]
arry2 = arry1.dup
arry2[1] = "JR"
arry2[2][0] = "have change!"
arry1 # =>["god", "dog", ["have change!", "big"], "ban"]
arry2 # => ["god", "JR", ["have change!", "big"], "ban"]
dup方法并不是完全的简单的复制...
一直不太明白p和puts到底什么区别,研究了一下:
class Foo
def inspect
"foo from inspect"
end
def to_s
"foo from to_s"
end
end
foo = Foo.new
p foo
puts foo
p "p: <#{foo}>"
puts "p: <#{foo}>"
=>foo from inspect
=>foo from to_s
=>p: <foo from to_s>
=>puts: <foo from to_s>
说明p 是使用 obj 的 inspect 方法,而 puts 是 to_s 方法。to_s 是对象的字符串表示, 是 puts 和双引号字符使用的方法。inspect 是对象状态的表示,用于 debug 中。 查了一下Object 中的定义了 to_s 和 inspect 方法,默认都是返回对象的类名和地址。
另外:
p "a","\nbb"
puts "a","\nbb"
#输出结果:
"a"
"\nbb"
a
bb
所以可以看出:
vim编辑器 emics编辑器 本地常用开发工具为Sublime
子类可以继承父类所有的属性和方法
子类可以对父类中的方法进行重定义
superclass 方法可以查看父类
Ruby 中一个类只能继承一个类
super 直接调用当前类父类的同名方法
self 引用当前类内部实例变量或实例方法
class << self 定义类方法
下午一直都在看布置的两个题,搜了好多东西,有关那两个题的东西不太多,讲的东西也都比较简单。大多都是clone和dup的比较,都是浅拷贝,都是对拷贝的对象引用,而不是引用所指的对象。在浅拷贝的时候,先创建一个新对象,然后再拷贝内部包含的其他对象的引用。
m = ["a"]
n = m.dup #克隆产生一个新对象
n[0] << "b" # n[0]和 m[0]都指向同一个对象,对其修改, n[0]和m[0]都会改变
p n #=>["ab"]
p m #=>["ab"]
n << "c" #对 n 所引用的对象进行操作
p n #=>["ab""c"] n 增加了一个元素
p m #=>["ab"] m没有变化
define_method 可以帮助我们动态的,快速的定义多个方法。
先定义一个类
class Post
attr_accessor :title, :content, :state
def initialize(title, content, state = :draft )
@title,@content,@state = title, content, state
end
def draft
@state = :draft
end
def posted
@state = :posted
end
def deleted
@state = :deleted
end
end
如果用 define_method的话就可以简化一部分代码
class Post
attr_accessor :title, :content, :state
def initialize(title, content, state = :draft )
@title,@content,@state = title, content, state
end
states = [:draft, :posted, :deleted]
states.each do |state|
define_method state do
@state = state
end
end
end
(1)访问控制权限:
1.公有实例方法可以通过实例直接访问
2.私有和被保护的实例方法可以通过公有的实例方法间接访问,不能直接访问
3.在没有注明实例方法是public或private或protected时,默认为public
(2)类方法,类常量:
1.类常量不能直接访问,不能被实例方法直接访问,可以被类方法访问
2.类方法可以被实例方法调用,调用格式:类名.类方法
(3)类实例方法
所有的类都是class类的实例
attr_writer:实例属性-------实例属性的getter方法
attr_reader:实例属性-------实例属性的setter方法
attr_accessor:实例属性-----实例属性的getter,setter方法
(4)define_method
自定义setup——accesor方法,作用和attr_accessor相同(理解)
def self.setup_accessor var
define_method var do
instance_variable_get "@#{var}" -----------***
end
define_method "#{var}=" do |value|
instance_variable_set "@#{var}", value -----------***
end
end
setup_accessor :name
setup_accessor :age
今天讲的大概也能听懂,但是我知道这里面还有很复杂的东西,通过今天布置的作业我搜了好多东西,也搜到了好多东西,面向对象里面还有很多内容,这种只能慢慢消化慢慢理解,可能忽然就懂了,现在只是模模糊糊,慢慢摸索吧。
面向对象是java,c++等重要的编程思路。ruby也一样,大致与java相同。有一些是不同的需要特别注意,如:对某个已定义的类追加方法和变量,一些新的用法类方法类变量,属性的声明。语言大同小异,掌握住它的特点,区分好他们的异同,基本都是相通的。
今天接触了Ruby中的面向对象这一编程思想。可能是老师讲的比较通俗吧,个人感觉并没有想象中的那么难理解,他举了一个“人”的例子,把人的各种年龄,体重等比作对象的属性,把由一个人的生活习性进而推断出大概寿命比作一个逻辑方法,我觉得这个例子特别好,以后可以把需要设计的复杂对象先设计一个简单类,再慢慢继承。还有就是实例方法和类方法的调用感觉还是要慢慢研究,先就这样吧,明天继续。
一周的学习结束了,今天看老师讲的例题,感觉ruby的方法真的好简单,今天的例子讲的几种方法真的很震惊,真的和c语言那种不一样。这一周可以说学到的东西不多,但是这一周的心历路程真的很复杂,刚开始的踌躇满志,后来听了两天一点也听不懂的忧伤,到现在跟原来学长的交流得知如果这一切得来的太容易也确实没有意义,现在每天都在补过去欠下的东西,所以我会比别人吃力,每个人都是公平的,付出与回报是成正比的,放假三天,我要好好把原来缺下的好好补补,我知道,看似风光的现在都有一段不堪回首的曾经,现在我已经鼓足信心,好对年都没成功过一件事情了,这次一定要努力。