• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    變量、常數、參數

    發布: 2007-7-04 20:03 | 作者: admin | 來源:  網友評論 | 查看: 62次 | 進入軟件測試論壇討論

    領測軟件測試網 2.1 將對象賦值給變量或常數時,會先拷貝該對象嗎?

    變量和常數都指向一個對象。即使不賦值, 它也是指向nil對象的。賦值操作只不過是讓它指向另一個新對象而已。

    所以, 賦值時并不會拷貝并生成一個新對象. 而是讓賦值表達式左邊的變量或常數指向表達式右邊的對象。

    盡管如此, 可能還是有人不理解. 這也是情有可原的, 因為上面的解釋并不能涵蓋所有的情況. 實際上, Fixnum、NilClass、 TrueClass、FalseClass以及Symbol類的實例會被變量或常數直接保存, 所以賦值時會被拷貝。其他類的實例都在內存上的其他地方, 變量和常數會指向它們。請參考立即值和使用。

    2.2 局部變量的作用域是如何劃定的?

    頂層、類(模塊)定義或方法定義都是彼此獨立的作用域。另外, 在塊導入新的作用域時, 它還可以使用外側的局部變量。

    塊之所以與眾不同, 是因為這樣能夠保證Thread或過程對象中的局部變量的"局部性"。while、until、for是控制結構, 它們不會導入新的作用域。另外, loop是方法, 它的后面跟著塊。

    2.3 何時才能使用局部變量?

    在Ruby解釋器運行Ruby腳本時, 它會一次讀取整個腳本,然后進行語法分析。若沒有語法問題的話, 才會開始執行句法分析中得到的代碼。

    在進行語法分析時, 只有在遇到局部變量的賦值語句之后, 才能使用它。例如

    for i in 1..2 if i == 2 print a else a = 1 end end

    把上述代碼寫入名為test.rb的腳本. 執行該腳本后發生如下錯誤

    test.rb:3: undefined local variable or method `a' for #<Object:0x40101f4c> (NameError) from test.rb:1:in `each' from test.rb:1

    當i值為1時,并不會發生錯誤;當i變成2之后就不行了。這是因為, 在進行語法分析時并不會按照運行時的邏輯順序來進行, 而只是機械地逐行分析. 在遇到print a語句時, a并未被賦值, 因而無法使用該局部變量. 之后,在運行時因為找不到名為a的方法, 所以發生錯誤。

    相反地, 若使用如下腳本則不會出現錯誤。

    a = 1 if false; print a #=> nil

    若您不想因為局部變量的這個特性而費神的話, 我們推薦您在使用局部變量之前, 添加a = nil賦值語句。這樣作還有一個好處, 就是可以加快局部變量的使用速度。

    2.4 常數的作用域是如何劃定的?

    類/模塊中定義的常數可以用在該類/模塊中。

    若類/模塊定義發生嵌套時, 可在內側類/模塊中使用外側的常數。

    還可以使用超類以及包含模塊中的常數。

    因為頂層中定義的常數已經被添加到Object類中, 所以您可以在所有的類/模塊中使用頂層中的常數。

    若遇到無法直接使用的常數時, 可以使用 類/模塊名+::操作符+常數名 的方式來使用它。

    2.5 實參是怎么傳遞給形參的呢?

    方法調用時, 會把實參賦值給形參。請您參考向變量進行賦值來了解Ruby中賦值的含義。若實參中的對象包含可以改變自身狀態的方法時,就必須注意其副作用(當然了,也有可能不是副作用)了。請參考破壞性的方法。

    2.6 將實參賦值給形參之后,對實參本身有什么影響嗎?

    形參是局部變量, 對其進行賦值之后, 它就會指向其他對象. 僅此而已, 它并不會對原來的實參有什么影響。

    2.7 若向形參所指對象發送消息的話,可能出現什么結果?

    形參所指對象實際上就是實參所指對象. 若該對象接到消息時狀態發生變化的話,將會影響到主調方。請參考破壞性的方法。

    2.8 參數前面的*是什么意思?

    各位C語言大俠請看好, 這可不是什么指針。在Ruby的參數前面添加一個*表示, 它可以接受以數組形式傳來的不定量的參數。

    def foo(*all) for e in all print e, " " end end foo(1, 2, 3) #=> 1 2 3

    另外,如果在方法調用中傳了一個帶*的數組, 則表示先展開數組然后再進行傳遞。

    a = [1, 2, 3] foo(*a)

    現在只能在以下部分的尾部使用*

    多重賦值的左邊 多重賦值的右邊 參數列表(定義方法時) 參數列表(調用方法時) case的when部分

    下面是在第(1)種形式中使用*的例子

    x, *y = [7, 8, 9]

    上面的代碼相當于x = 7、y = [8, 9]。另外,下面的代碼

    x, = [7, 8, 9]

    也是合法的, 此時x = 7. 而

    x = [7, 8, 9]

    則表示x = [7, 8, 9]。

    2.9 參數前面的&代表什么?

    在參數前面添加&之后,就可以像使用塊那樣來傳遞/接收過程對象。它只能位于參數列表的末尾。

    2.10 可以給形參指定默認值嗎?

    可以。

    在調用函數時,才會計算該默認值。您可以使用任意表達式來設定Ruby的默認值(C++只能使用編譯時的常數). 調用方法時,會在方法的作用域內計算默認值。

    2.11 如何向塊傳遞參數呢?

    在塊內部的前端,使用||將形參括起來之后, 就可以使用實參進行多重賦值了。該形參只是普通的局部變量, 若塊的外側已經有同名參數時, 塊參數的作用域將擴大到塊外側, 請留意這個問題。

    2.12 為什么變量和常數的值會自己發生變化?

    請看下例。

    A = a = b = "abc"; b << "d"; print a, " ", A #=> abcd abcd

    對變量或常數進行賦值, 是為了以后通過它們來使用對象。這并不是將對象本身賦值給變量或常數, 而只是讓它們記住對該對象的引用。變量可以修改這個引用來指向其他的對象, 而常數卻不能修改引用。

    對變量或常數使用方法時, 實際上就是對它們所指的對象使用該方法。在上例中, <<方法修改了對象的狀態,所以引發了"非預期"的結果。若該對象是數值的話, 就不會發生這種問題, 因為數值沒有修改其自身狀態的方法。若對數值使用方法時, 將返回新的對象。

    這個例子雖然是用字符串來作演示的, 但就算使用帶有可修改自身狀態的方法的那些對象, 如數組或哈希表等來試驗的話, 效果也是一樣的。

    2.13 常數不能被修改嗎?

    若想讓指向某對象的常數轉而指向其他對象時, 就會出現warning。

    若該對象帶有破壞性的方法的話, 則可以修改該對象的內容。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>