1.实例变量:和对象关联在一起
2.类变量:主要在类中定义就是该类的类变量,不管是在单例作用域中还是在实例方法中
3.局部变量:会被作用域隔离,并和binding结合在一起
4.全局变量(预定义变量)
5.常量(预定义常量)
1.实例变量
#对象是由指向类的引用和一组实例变量组成的
class Demo
def demo=(xx)
@demo = xx
end
def demo
@demo
end
end
obj = Demo.new
obj.demo="demo"
obj.demo #=>"demo"
obj.inspect #=>"#<Demo:0x007f98ea847210 @demo=\"demo\">" 对象携带了实例变量
#顶级实例变量:顶级对象main的实例变量,只要main对象扮演self的角色,就可以访问顶级实例的变量
#顶级实例变量的作用是在main是self的情况下,可以代替全局变量
self #=>main
self.class #=>Object
@var = "the top-level @var"
def my_method
@var
end
my_method #=>"the top-level @var"
#实例变量的定义和查找
class B
#这两个变量在类B的作用域中
@a = 1
@@b = 2
def initialize
#这两个变量在类B的实例化对象的作用域中
@c = 3
@@d = 4
end
class << self
#这两个变量在单例作用域中
@e = 5
@@f = 6
end
end
b = B.new
p B.instance_variables #=>[:@a]
#说明在B作用域内,只要使用@@符号定义的变量,均为B类的类变量
p B.class_variables #=>[:@@b, :@@f, :@@d]
p b.instance_variables #=>[:@c]
p B.singleton_class.instance_variables #=>[:@e]
p B.singleton_class.class_variables #=>[]
2.类变量
从上面的实例变量的定义和查找的代码示例中可以看到,只要在类中进行定义,不管这个类变量是在类的范围内,实例或者单例方法范围内,都被认为是该类的类变量。
3.局部变量
被作用域关闭限制,可以通过binding的形式获得局部变量的值。
#对象并没有携带局部变量,同时因为def是一个作用域门,demo和demo=中间的hello不是同一个局部变量
class Demo
def demo=(xx)
hello = xx
end
def demo
hello
end
end
obj = Demo.new
obj.demo="demo"
obj.inspect #=> "#<Demo:0x007fbb27847260>",对象并没有携带实例变量
obj.demo #=>"demo" undefined local variable or method `hello'
代码块携带局部变量,块中一个非常重要的观点是绑定,块会绑定其局部变量,在块对象上调用call方法,这个块对象会一直绑定这局部变量。
def counter(n)
#代码块会保留当前作用域中的变量
proc { n +=1 }
end
a = counter(10)
a.call #=>11
a.call #=>12
实例变量和局部变量的对比
#实例变量和对象绑定,self对象是main
def test
@demo = "this is the demo"
end
test
puts @demo #=> this is the demo
#局部变量情况,def创建了一个作用域门,local variable只在作用域门中有效
def test
demo = "this is the demo"
end
test
puts demo #undefined local variable and method test
#总结:局部变量受限于类、块、方法和模块,只在这个范围内有效
4.全局变量(预定义变量)
#全局变量
使用“$”开头表示
#全局变量在任何作用域中都可以被访问和修改:
def a_scope
$var = "some value"
end
def another_scope
$var
end
a_scope
another_scope #=>"some value"
$_ get方法最后读取的字符串
$& 最后一次模式匹配后得到的字符串
$~ 最后一次模式匹配相关的信息
$` 最后一次模式匹配中匹配部分之前的字符串
$' 最后一次模式匹配中匹配部分之后的字符串
$+ 最后一次模式匹配中最后一个()对应的字符串
$1,$2.. 最后一次模式匹配中()匹配的字符串(第n个()对应的$n)
$? 最后执行完毕的子进程的状态
$! 最后发生的异常的相关信息
$@ 最后发生的异常的相关位置信息
$SAFE 安全级别(默认为0)
$/ 输入数据的分隔符(默认为"\n")
$\ 输出数据的分隔符(默认为nil)
$, Array#join的默认分隔字符串(默认为nil)
$; String#split的默认分隔子符串(默认为nil)
$. 最后读取的文件的行号
$< ARGF的别名
$> print, puts, p 等的默认输出位置(默认为STDOUT)
$0 $PROGRAM_NAME的别名
$* ARGV的别名
$$ 当前执行中的Ruby的进程ID
$: $LOAD_PATH的别名
$" $LOADED_FEATURES的别名
$DEBUG 指定debug模式的标识(默认为nil)
$FILENAME ARGF当前在读取的文件名
$LOAD_PATH 执行require读取文件时搜索的目录名数组
$stdin 标准输入(默认为STDIN)
$stdout 标准输出(默认为STDOUT)
$stderr 标准错误输出(默认为STDERR)
$VERBOSE 指定冗长模式的标识(默认为nil)
$PROGRAM_NAME 当前执行中的Ruby脚本的别名
$LOADED_FEATURES require读取的类库名一览表
5.常量(预定义常量)
ARGF 参数,或者从标准输入得到的虚拟文件对象
ARGV 命令行参数数组
DATA 访问__END__以后数据的文件对象
ENV 环境变量
RUBY_COPYRIGHT 版权信息
RUBY_DESCRIPTION ruby -v显示的版本信息
RUBY_ENGINE ruby的处理引擎
RUBY_PATCHLEVEL ruby的补丁级别
RUBY_PLATFORM 运行环境的信息
RUBY_RELEASE_DATE ruby的发布时间
RUBY_VERSION ruby的版本
STDERR 标准错误输出
STDIN 标准输入
STDOUT 标准输出