ruby中实例变量、类变量等等的区别和联系
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=nameirb(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
=> nilirb(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
=> nilirb(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
=> nilirb(main):039:0> x.age=20
=> 20irb(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)
@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.15irb(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中实例变量、类变量等等的区别和联系的更多相关文章
- 3.ruby语法基础,全部变量,实例变量,类变量,局部变量的使用和注意的要点
1.ruby的全局变量的概念和Java的全局变量的概念不同, ruby的全局变量是以$符号开头的,如果给全局变量的初始化值为nil会出现警告. 赋值给全局变量,这是ruby不推荐的,这样会使程序变得很 ...
- java 中静态变量(类变量)与实例变量 静态方法与实例方法
静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: public class Demo{ int i1=0; static ...
- ios -- 成员变量、实例变量与属性的区别
最近打开手机就会被胡歌主演的<猎场>刷屏,这剧我也一直在追,剧中的郑秋冬,因为传销入狱五年,却在狱中拜得名师孙漂亮(孙红雷),苦学HR,并学习了心理学,成功收获两样法宝.出狱后因为怕受 ...
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...
- .NET中公共变量与属性的区别
在我们的程序中经常会出现以下的代码: 如: 成员变量 public string Name; 或者用属性 private string name ...
- ruby中proc和lambda的return区别
学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...
- Java中成员变量和局部变量的区别
java面向对象过程中,最基本的两类变量就是成员变量和局部变量 成员变量是写在类中并且写在方法外部,一般写在每个类的头部,用于初始化或者方法操作,作用域是整个类被实例化到被销毁,中间变量都可以被外部方 ...
- PHP接口中的静态变量、常量与类中静态变量、常量的区别
接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不 ...
- Linux中环境变量相关文件的区别
Linux下各种不同环境变量相关文件的作用: 1. /etc/environment 设置整个系统的环境,系统启动时,该文件被执行. 2. /etc/profile 设置所有用户的环境,当用 ...
随机推荐
- php时区测试
php里面关于时间的函数有date,time,strtotime,gmdate等,里面只要和时间字符串相关的基本都收到时区的影响,所以时间戳才是唯一稳定时间记录,因为标准都是统一的.这里联想到数据库的 ...
- js中substring和substr的用法
js中substring和substr的用法 substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 参数 ...
- JavaScript备忘录-逻辑运算符
关于 || 和 && 运算符 var name=(document.getElementById('txtName') || '') && document.getEl ...
- 《Unix网络编程》卷2 读书笔记 第2章- Posix IPC
1. 概述 Posix IPC 包括:Posix消息队列.Posix信号量.Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点. 本章讲述所有这些共同属性:用于标识 ...
- Android下实现tab页个人比较推崇的方法
使用fragment实现tab页的效果: 三个页面是单独的三个Fragment 主Activity的实现: package com.hsx.tab; import android.os.Bundle; ...
- 计算机网络——TCP三次、四次握手详解
三次握手:建立TCP连接 连接建立过程: B的TCP服务器进程先创建传输控制块TCB(存储了每一个连接中的一些重要信息,如:TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号 ...
- RAC 环境下的重要参数
Oracle 数据库启动时会根据参数文件中提供的相关参数启动Oracle实例.这些参数包括数据库名字.sga,pga的分配,控制文件的位置,undo,process等等.Oracle RAC数据库同样 ...
- cocos2d-x for android:SimpleGame分析
cocos2d-x for android:SimpleGame分析 作为cocos2d-x的标配DEMO,SimpleGame可算是给入门学cocos2d-x的俺们这些新手门学习的对象了,那么来分析 ...
- in 和 exist 区别
select * from Awhere id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B ...
- window 7 下一台cp 两个mysql 配置主从
环境 : 个人 pc windows7 一台 ; 使用 : 官方下载: mysql-noinstall-5.5.11-win32.zip 1. 解压 成2个 (文件夹) mysql_master (主 ...