ruby中執行個體變數、類變數等等的區別和聯絡

來源:互聯網
上載者:User

標籤: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中執行個體變數、類變數等等的區別和聯絡

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.