標籤:ar 使用 sp strong div on 代碼 bs ad
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> [email protected]
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)
@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中執行個體變數、類變數等等的區別和聯絡