1. 模块
1.1 定义,含混
module ModuleName
def moduleInfo
puts "I am a method in Module"
end
def self.moduleInfo2
puts "类方法成员"
end
end
class PastInclude
include ModuleName #混含操作
def classInfo
puts "I am a method in class"
end
end
test=PastInclude.new
test.classInfo
test.moduleInfo
ModuleName.moduleInfo2
I am a method in class
I am a method in Module
类方法成员
1.2 命名空间
module ModulePlace1
class FirstPlace
def moduleInfo
puts "I am in ModulePlace1, I am moduleInfo"
end
end
end
module ModulePlace2
class SecondPlace
def moduleInfo
puts "I am in ModulePlace2, I am moduleInfo too"
end
end
end
test1=ModulePlace1::FirstPlace.new
test1.moduleInfo
test2=ModulePlace2::SecondPlace.new
test2.moduleInfo
I am in ModulePlace1, I am moduleInfo
I am in ModulePlace2, I am moduleInfo too
2. BEGIN END
BEGIN
块是注册初始化,限于该文件的任何语句来执行END
块是注册结束,会在解释器释放文件的时候执行at_exit
块与END
块相似,但执行时间比END晚
BEGIN{
puts "I am begin 1"
}
BEGIN{
puts "I am begin 2"
}
BEGIN{
puts "I am begin 3"
}
at_exit{
puts "I am at_exit 1"
}
at_exit{
puts "I am at_exit 2"
}
at_exit{
puts "I am at_exit 3"
}
END{
puts "I am end 1"
}
END{
puts "I am end 2"
}
END{
puts "I am end 3"
}
I am begin 1
I am begin 2
I am begin 3
I am end 3
I am end 2
I am end 1
I am at_exit 3
I am at_exit 2
I am at_exit 1
3. 导入
3.1 load,require
同一文件夹下创建两个.rb
文件
5Model1.rb
module Module1
def saySomething
puts "我只是个Module1中的普通的方法"
end
def self.singSong
puts "我是Module1 中的类方法"
end
end
Module1.singSong
6Module2.rb
puts "加载Module1...."
load "5Module1.rb" #加载本文件夹中的另一Ruby文件
运行6Module2.rb
加载Module1….
我是Module1 中的类方法
require 不仅可以加载Ruby文件,还可以加载其他语言写的源文件
同一文件夹两Ruby文件:
ModuleA.rb
def moduleA
puts "I am moduleA"
end
ModleB.rb
require "#{File.dirname(__FILE__)}/moduleA"
moduleA
运行ModleB.rb
I am moduleA
3.2 extend
在类中引入模块,并且将模块中的方法作为类方法
module Module1
def saySomething
puts "Hi..."
end
end
class Man
extend Module1
end
he=Man.new
#用he.saySomething 会有错误
he.extend(Module1)
he.saySomething
Hi…
4. 别名
关键字 | 说明 |
---|---|
alias | 给方法,全局变量添加别名 |
Module类中alias_method | 给方法添加别名 |
def sing
puts "I sing a song, its name is Old Man"
end
alias singNew sing
def sing
puts "I sing a song, its name is What"
end
sing # 新定义的sing
singNew #仍旧绑定之前没有被重新定义的方法
I sing a song, its name is What
I sing a song, its name is Old Man
5. 对定义操作
class Person
def saySomething
puts "Good morning!"
puts defined? "hello"
end
end
he=Person.new
he.saySomething
puts defined?he.saySomething
Good morning!
expression
method
返回值 | 说明 | 返回值 | 说明 |
---|---|---|---|
super | super可用 | assignment | 局部变量被定义,未赋值 |
method | 已被定义方法 | local-variable | 局部变量被赋值 |
yield | yield可用 | local-variable(in-block) | 被赋值并且在代码块中 |
self | self可用 | global-variable | 全局变量被赋值 |
nil | 对象为nil | instance-variable | 实例变量被赋值 |
true | 表达式为true | constant | 常量 |
false | 表达式为false | class | variable 类变量 |
expression | 表达式 |
释放定义用undef
6. method_missing
class Student
def doHomework
puts "I can do homework"
end
def method_missing pd
puts "我不会#{pd.to_s}啊!"
end
def self.method_missing pd
puts "我也不会 #{pd.to_s}。。。"
end
end
he=Student.new
he.doHomework
he.eat
Student.goHome
I can do homework
我不会eat啊!
我也不会 goHome。。。