Ruby关于类一些简单记录
#!/usr/bin/env ruby
class Greeter
attr_accessor :name
def initialize(name="Hello World")
@name = name;
end
def say_hi(age="36")
puts "Hi #{@name} #{age}!"
end
def say_bye
puts "Bye #{@name},come back soon"
end
end
g = Greeter.new("Pat")
g.say_hi(36)
g.say_bye()
#puts Greeter.instance_methods(false)#列出类自身的方法排除继承
#puts Greeter.instance_methods()#列出全部的方法
puts g.name
puts g.respond_to?("say_hi") #对特定方法的回应是否存在
几点说明:
@name :它是类中的实例变量 对类中的方法都实用。
attr_accessor :name 这个name外部可以访问
#{@name} :将类内部的变量插入的字符串中
#{name} :将外部的变量插入类中的字符串中
Ruby 中不比使用retur你来从方法中返回值方法中最后一个表达式的值将作为方法的返回值
initialize是个特殊的方法 在基于类创建对象时被调用 其参数接受的是Object.new(attr,..)传递过来的参数
局部变量:基本变量成为局部变量 x=10 puts x
全局变量:在变量名之前加上($) 即可定义全局变量 $x
对象变量:变量前面有个@ 即在对象的任何方法中都能访问
类变量 :作用于整个类中 变量名前有两个 @@
类方法:self.前缀表示
class Square
def self.test_method #类方法 或者 Square.test_method
puts "Class'methods"
end
end
对象方法:只有在创建了对象才能使用的方法 被视为 对象方法
defined?(变量名) #检测是否定义了该变量
继承:Ruby不支持多重继承,是单继承
def method1
puts "Method1 in Parent"
end
end
class ChildClass < ParentClass
def method1
puts "Method1 in Child"
super #调用父类中同名的方法
end
end
p = ParentClass.new
p.method1
c = ChildClass.new
String.instance_variables #返回对象实例关联的实例变量
attr_accessor :name ,:age
def initialize(name,age)
@name = name
@age = age
end
def method1
puts "Method1 in Parent"
end
end
class ChildClass < ParentClass
def method1
puts "Method1 in Child"
super # call the same method in parentclass
end
end
p = ParentClass.new("liujijun",36)
p.method1
c = ChildClass.new("liaohuifang",36)#初始化父类
c.method1
封装:它让某些方法和属性变得公共可用 其他对外不可见。
class Parent
private#以下的方法均为私有的
public#相反
end
把private当成命令向其传递一组符号参数 把这些符号表示的参数设置为私有的
class Parent
def priavteMethod
end
def publicMethod
end
def protectMethod
end
protect:protectMethod
public :publicMethod
private :privateMethod
多态:编写代码可以同时适用于多种类型和类的对象
嵌套类:把类放入其他的类中 如果某个类依赖于其他类 而这些其他类仅在此处有用就可以使用嵌套类。
def Drawing.give_me_a_circle
Circle.new
end
class Line
end
class Circle
def what_am_i
"This is a circle"
end
end
end
a = Drawing.give_me_a_circle
puts a.what_am_i
b = Drawing::Circle.new
puts b.what_am_i
常量的作用域:常量定义在当前类的作用域中除非被覆写。
模块、命名空间、掺入:
class Ruler
attr_accessor :length
end
end
module B
class Ruler
attr_accessor :length
end
end
a = A::Ruler.new
b = B::Ruler.new
%w{}创建数组
include 命令把模块的内容放到当前的作用域中 。
Enumerable模块:
Comparable模块:
=> ["==", "between?", ">=", "<", "<=", ">"]