Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下:
一、命名方式
1.局部变量:小写字母或者“_”开头,如user,解释器解释到时才开始在内存中存在,一个良好的习惯是在进行变量定义时用nil进行赋值初始化,否则会出现类似undefined local variable or method `z'的错误;
2.实例变量:@开头,如@user,默认初始化为nil,此处的“实例”指的是类对象本身,或者类的对象;
3.类变量:@@开头,如@@user,需要进行初始化后才能调用,否则会出现类似uninitialized class variable @@user in Account的错误;
4.全局变量:$开头,如$user,默认初始化为nil;
二、作用范围
局部变量:如user,只作用于本类、本方法或本模块内,不同于java语言习惯,在类中定义的变量,可以在类的方法中进行调用,Ruby中的局部变量,类中定义的,只能在类中访问,其子类、方法、内部类中都无法调用,如下边示例代码:
class Account user=User.new def myMethod puts user.name #调用发生错误,user未定义 end end
实例变量:如@user,有点类似于java中POJO类的成员变量,类中随意访问,类外通过方法访问,作用于本实例对象范围内或本类的实例对象范围内(这句话有点绕口,请注意分清楚类对象本身[Account,是Class类的一个对象]和 类实例化后的对象[Account.new,是Account类的一个对象]),这是两个相互独立的域,定义在Account中的变量不能在Account.new中访问,反之亦然,如下边示例代码:
class A #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil @alpha='This is @alpha\' value!' def A.look puts "#@alpha" end def look puts "#@alpha" end endA.look #输出:'This is @alpha' value!'' A.new.look #输出:''
再看如下代码:
class A #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil @alpha='This is @alpha\' value!'def A.look puts "#@alpha" end def look @alpha='This is @alpha\' value from look!' puts "#@alpha" end def look_again puts "#@alpha" end end
A.look #输出:'This is @alpha' value!'' a=A.new a.look #输出:'This is @alpha' value from look!' a.look_again #输出:'This is @alpha' value from look!'
可见,@alpha='This is @alpha\' value!'是定义在类对象本身的实例变量,@alpha='This is @alpha\' value from look!'是定义在类实例化后的对象中的实例变量,另外,使用实例变量时还应该注意一下几点:
1、实例变量不管是在类中定义,还是在方法中定义,其都属于类,而不是方法
2、实例变量只存在于实例范围,不可在子类中引用或者赋值
3、实例变量永远都是Private的,不能暴露为Public,外部访问通过方法进行,可以使用attr_accessor简便定义
类变量:如@@user,作用于类的所有范围,所有实例对象共享,包括子类及其实例对象,类变量通过Protected声明的,如下边示例代码:
class A #类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil @@alpha='This is @alpha\' value!'def A.look puts "#@@alpha" end def look puts "#@@alpha" end def look_again puts "#@@alpha" end end
class B<A end
A.look #输出:'This is @alpha' value!' B.look #输出:'This is @alpha' value!' a=A.new a.look #输出:'This is @alpha' value!' a.look_again #输出:'This is @alpha' value!' b=B.new b.look #输出:'This is @alpha' value!' b.look_again #输出:'This is @alpha' value!'
全局变量:如$user,尽量少使用 ,作用于整个程序的生命周期,常驻内存,过量使用会引起性能下降,内存溢出,Ruby内置一些全局变量,获取相关数据十分方便,如$0'代表的是所运行应用程序的文件名称,‘$:'代表的是默认的文件搜索路径;'$$'代表的是 ruby 程序的进程 id。
本文向大家介绍Ruby中的方法(函数)学习总结,包括了Ruby中的方法(函数)学习总结的使用技巧和注意事项,需要的朋友参考一下 1、Ruby中方法名和变量名的命名规则一样(以小写字母开头,单词之间的分隔使用“_”,),不过可以在方法名后边带上!(重磅方法)或者?(布尔类型返回值)。 2、方法的参数请使用(),参数都是局部变量,可以为这些参数设置默认值,带“*”的参数是可选动态参数,可以传入一个或者
本文向大家介绍Ruby的基本语法学习总结,包括了Ruby的基本语法学习总结的使用技巧和注意事项,需要的朋友参考一下 1、关键字 关键字不能用于定义变量或者常量,module,class,def , undef,defined?,if ,then,else,elsif,case ,when,unless,for,in,while ,until,next,break,do,redo ,retry,yi
本文向大家介绍Ruby中的变量,包括了Ruby中的变量的使用技巧和注意事项,需要的朋友参考一下 Ruby变量 Ruby支持以下类型的变量: 实例变量 类变量 局部变量 全局变量 1)实例变量 一个实例变量总是开头@。如果您不初始化实例变量,那么它将在编译时从编译器获取nil值。它们的值对于对象的某些实例是有限的或局部的。存在一个实例变量的多个副本,并且同一类的每个对象都可以访问其实例变量的本地副本
本文向大家介绍R学习变量的功能,包括了R学习变量的功能的使用技巧和注意事项,需要的朋友参考一下 示例 通常,R您会想知道有关正在使用的对象或变量的信息。在阅读别人的代码甚至您自己的代码时,这很有用,尤其是在使用您不熟悉的软件包时。 假设我们创建一个变量a: 这是什么数据类型?你可以找到 这是一个矩阵,因此矩阵运算将在其上进行: 的尺寸是a多少? 其它有用的功能,对于不同的数据类型的工作是head,
主要内容:Ruby 全局变量,实例,Ruby 实例变量,实例,Ruby 类变量,实例,Ruby 局部变量,Ruby 常量,实例,Ruby 伪变量变量是持有可被任何程序使用的任何数据的存储位置。 Ruby 支持五种类型的变量。 一般小写字母、下划线开头:变量(Variable)。 开头:全局变量(Global variable)。 开头:实例变量(Instance variable)。 开头:类变量(Class variable)类变量被共享在整个继承链中 大写字母开头:常数(Constant)。
原因 在做 Python web 开发的过程中发现有不少库都借鉴自 Ruby,比如 Plim 与 Slim, factory_boy 与 factory_girl ,gunicorn 与 unicorn 等等。 所以在需要看源码的情况下,直接看 Ruby 实现可能会比看 Python 的更好。 当然,这里并不是说 Ruby (在这些方面)领先 Python 很多,语言之间的互相借鉴 本就是非常常见