ruby的变量有局部变量,全局变量,实例变量,类变量,常量。

1、局部变量

局部变量以一个小写字母开头或下划线开头

局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声明所在的块、方法定义、类/模块定义的结尾。大家在写代码时经常这样写:

irb(main):001:0> i=123    ---------- 这里的i就是局部变量

=>123

irb(main):002:0> s="hi"   ---------- 这里的s就是局部变量

=>"hi"
 ruby的变量是动态变量,某个变量在前一刻是数字型,在后一刻可以是字符型:

irb(main):003:0> x=321

=>321

irb(main):004:0> x="hello"

=>"hello"

ruby是动态变量,但却是强类型,例如字符和数字不能直接相加:

irb(main):005:0> x=10

=>10

irb(main):006:0> y="hi"

=>"hi"

irb(main):007:0> x+y

TypeError: String can't be coerced into Fixnum

from(irb):7:in '+'

from(irb):7
    from : 0

必须手工进行转换: irb(main):008:0>  x.to_s + y

=> "10hi"

2、全局变量

ruby的全局变量以$开头,例如:  $x   $y。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil

ruby有内置的全局变量,应该是从perl哪里抄来的,例如 $!记录最近一次产生的错误,$. 表示行号等。良好的编程实际,是不使用全局变量,他们危险而难以跟踪。

3、实例变量

ruby的实例变量以@开头,是指实例化后的对象,才绑定的变量。实例变量属于特定的对象。例如:

irb(main):016:0> class Myclass
irb(main):017:0>   def initialize(name,gender,age)
irb(main):018:0>      @name=name

irb(main):019:0>      @gender=gender
irb(main):020:2>      @age=age
irb(main):021:0>   end
irb(main):022:0> end
=> nil    ---------------@name, @gender,@age都是实例变量。可以在类或子类的方法中引用实例变量。若引用尚未被初始化的实例变量的话,其值为nil。

irb(main):023:0> x=Myclass.new("john")
=> #<Myclass:0x7f2e15a7dad8 @name="john">

Myclass类,他的构造器接收一个name参数,然后把该参数赋值给实例变量@name。

x是Myclass的实例,她拥有实例变量@name。

只有在类被实例化时,实例变量才产生和存在。但是,实例对象并不能直接访问实例变量:

irb(main):022:0> x.@name
SyntaxError: compile error
(irb):22: syntax error, unexpected tIVAR
        from (irb):22
        from :0

这样是错误的。必须在;类里面,定义get方法,来访问实例变量:

irb(main):023:0> class Myclass
irb(main):024:1>   def name
irb(main):025:2>     @name
irb(main):026:2>   end
irb(main):027:1> end
=> nil

irb(main):028:0> x.name
=> "john"

当然,也可以定义set方法,来设置实例变量:

irb(main):029:0> class Myclass
irb(main):030:1>   def name=(value)
irb(main):031:2>     @name=value
irb(main):032:2>   end
irb(main):033:1> end
=> nil

irb(main):034:0> x.name="jean"
=> "jean"

irb(main):035:0> x.name
=> "jean"

这个set和get,可以通过ruby的元编程来实现,例如:

irb(main):036:0> class Myclass
irb(main):037:1>   attr_accessor :age
irb(main):038:1> end
=> nil

irb(main):039:0> x.age=20
=> 20

irb(main):040:0> x.age
=> 20

只要设置attr_accessor就够了,他会对@age这个实例变量,创建set和get方法。

irb(main):041:0> x
=> #<Myclass:0x7f2e15a7dad8 @name="jean", @age=20>

对应的还有attr_reader只设置get方法,attr_writer只设置set方法。

4、类变量

   ruby的类变量以@@开头,例如在类里申明的@@x @@y 等,一般很少使用。

类变量在类的定义中定义,可以在类的特殊方法、实例方法等处对类变量进行赋值和引用。类变量被类,类的子类和他们的实例对象共享。

class Person

@@number = 0 #使用前必须有初值

def initialize(name, gender, age)

@name = name

@gender = gender

@age = age

@@number += 1

end

end

类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。可以把类变量看作一种被类、子类以及它们的实例所共享的全局变量。

模块中定义的类变量(模块变量)被所有包含该模块的类所共享。

module TestModule

@@foo = 10

end

class Klass

include Foo

p @@foo += 1          # => 11

end

class Base

include Foo

p @@foo += 2          # => 12

end

5、常量

ruby的常量以大写字母开头,常数的定义和初始化由赋值过程完成。

irb(main):048:0>Pi=3.14            ----------Pi就是一个常量

=>3.14

然而,ruby的常量是可以改变的。若对已定义的常数进行赋值的话,会出现警告信息:

irb(main):049:0> Pi=3.15
(irb):49: warning: already initialized constant Pi
=> 3.15

irb(main):050:0> Pi
=> 3.15

尽管触发警告,但常量的确被改变了。

注意:1)若引用未定义的常数会引发NameError异常。

2)常量可以定义在类和模块中,不能定义在方法中

通常在类里设置常量:

irb(main):051:0> class Myclass
irb(main):052:1>   Pi=3.1415
irb(main):053:1> end
=> 3.1415

3)若想在外部访问类或模块中的常数时,要使用“::”操作符.

从类的外部访问这个常量:irb(main):055:0>Myclass::Pi

=>3.1415

模块也一样,例如访问ruby内置的Math模块的PI常量: irb(main):056:0>Math::PI

=>3.14159265358979

4)在类定义表达式生成类对象的同时,还会将类对象赋值给一个与该类同名的常数,引用类名也就是引用该常数。

class Test

end

p Test.class         #Class

p Test               #test

若想访问Object类中的常数(顶层的常数)时,也需要也使用"::"操作符,但操作符左边为空。

[置顶] ruby变量详解(收集+整理)的更多相关文章

  1. [置顶] SNMP协议详解<二>

    上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1.v2c.v3)进行区别! 四.SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Agent ...

  2. [置顶] SNMP协议详解<三>

    在上篇文章中,说到了SNMPv3主要在安全性方面进行了增强,采用USM(基于用户的安全模型)和VACM(基于视图的访问控制模型)技术.下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密 ...

  3. Nginx基础篇(2)- Nginx基本配置文件和变量详解

    Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...

  4. Ansible Facts 变量详解

    Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...

  5. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  6. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  7. Maya 常用环境变量详解

    Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...

  8. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  9. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

随机推荐

  1. C# Chart圖標綁定

    开发软件为VS2010 免去了安装插件之类的麻烦. 最终效果图: 饼状图: 前台设置:设置参数为: :Titles, 添加一个序列,在Text中设置名字. :Series ,添加一个序列,选择Char ...

  2. Flume研究心得

    最近两天,仔细的看了一下Flume中央日志系统(版本号:1.3.X),Flume在本人看来,还是一个非常不错的日志收集系统的,其设计理念非常易用,简洁.并且是一个开源项目,基于Java语言开发,可以进 ...

  3. 解决ListView异步加载图片错乱问题 .

    发一个异步图片加载控件.网上也有大把的异步网络加载图片的控件,但是有一个问题,异步加载会造成列表中的图片混乱,因为列表的每一项的View都可能被重用,异步加载的时候多个异步线程引用到了同一个View将 ...

  4. 学C++不得不看的一篇文章[转]

    1. 扎实的基础.数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序.据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件.程序人人都会写,但当 ...

  5. JQuery zoom插件学习

    jquery zoom是一款图片放大插件,经常用在商城商品页面里. 使用JQuery zoom插件,除了需要引入JQuery.js外,还要引入JQuery.zoom.js文件及jqzoom.css文件 ...

  6. python模块之paramiko

              46.python模块之paramiko   SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  7. python学习的一些感悟

    首先声明,这里用到的库是在coursera上学习时,老师建立的一个库 #timer import simplegui import random # global state message = &q ...

  8. oracle 的一点累积

    1.  oracle用户相关 sqlplus sys/oracle as sysdba    -- sys登录 create user xxx identified by password;   -- ...

  9. A Statistical View of Deep Learning (II): Auto-encoders and Free Energy

    A Statistical View of Deep Learning (II): Auto-encoders and Free Energy With the success of discrimi ...

  10. 【Java】WebService教程

    Web Services Web Services可以将应用程序转换为网络应用程序. Web Services可以被其他应用程序利用. 基本的Web Services平台是XML + HTTP. WS ...