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             标准输出

results matching ""

    No results matching ""