在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
ruby的变量有局部变量,全局变量,实例变量,类变量,常量。 1、局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声明所在的块、方法定义、类/模块定义的结尾。大家在写代码时经常这样写: irb(main):001:0> i=123 ---------- 这里的i就是局部变量 =>123 irb(main):002:0> s="hi" ---------- 这里的s就是局部变量 =>"hi" 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 必须手工进行转换: irb(main):008:0> x.to_s + y => "10hi"
ruby的全局变量以$开头,例如: $x $y。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil ruby有内置的全局变量,应该是从perl哪里抄来的,例如 $!记录最近一次产生的错误,$. 表示行号等。良好的编程实际,是不使用全局变量,他们危险而难以跟踪。
3、实例变量 ruby的实例变量以@开头,是指实例化后的对象,才绑定的变量。实例变量属于特定的对象。例如:
这样是错误的。必须在;类里面,定义get方法,来访问实例变量: irb(main):023:0> class Myclass 当然,也可以定义set方法,来设置实例变量: irb(main):029:0> class Myclass 这个set和get,可以通过ruby的元编程来实现,例如: irb(main):036:0> class Myclass 只要设置attr_accessor就够了,他会对@age这个实例变量,创建set和get方法。
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 尽管触发警告,但常量的确被改变了。 注意:1)若引用未定义的常数会引发NameError异常。 2)常量可以定义在类和模块中,不能定义在方法中 通常在类里设置常量:
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类中的常数(顶层的常数)时,也需要也使用"::"操作符,但操作符左边为空。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论