亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Verzeichnis suchen
Ruby用戶(hù)指南 3、開(kāi)始 4、簡(jiǎn)單的例子 5、字符串 6、正則表達(dá)式 7、數(shù)組 8、回到那些簡(jiǎn)單的例子 9、流程控制 10、迭代器 11、面向?qū)ο笏季S 12、方法 13、類(lèi) 14、繼承 15、重載方法 16、訪(fǎng)問(wèn)控制 17、單態(tài)方法 18、模塊 19、過(guò)程對(duì)象 20、變量 21、全局變量 22、實(shí)變量 23、局部變量 24、類(lèi)常量 25、異常處理:rescue 26、異常處理:ensure 27、存取器 28、對(duì)象的初始化 29、雜項(xiàng) RGSS入門(mén)教程 1、什么是RGSS 2、開(kāi)始:最簡(jiǎn)單的腳本 3、數(shù)據(jù)類(lèi)型:數(shù)字 4、數(shù)據(jù)類(lèi)型:常量與變量 5、數(shù)據(jù)類(lèi)型:字符串 6、控制語(yǔ)句:條件分歧語(yǔ)句 7、控制語(yǔ)句:循環(huán) 8、函數(shù) 9、對(duì)象與類(lèi) 10、顯示圖片 11、數(shù)組 12、哈希表(關(guān)聯(lián)數(shù)組) 13、類(lèi) 14、數(shù)據(jù)庫(kù) 15、游戲?qū)ο?/a> 16、精靈的管理 17、窗口的管理 18、活動(dòng)指令 19、場(chǎng)景類(lèi) Programming Ruby的翻譯 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 類(lèi),對(duì)象和變量 容器Containers,塊Blocks和迭代Iterators 標(biāo)準(zhǔn)類(lèi)型 深入方法 表達(dá)式Expressions 異常,捕捉和拋出(已經(jīng)開(kāi)始,by jellen) 模塊 基本輸入輸出 線(xiàn)程和進(jìn)程 當(dāng)遭遇挫折 Ruby和它的世界 Ruby和Web開(kāi)發(fā) Ruby Tk Ruby 和微軟的 Windows 擴(kuò)展Ruby Ruby語(yǔ)言 (by jellen) 類(lèi)和對(duì)象 (by jellen) Ruby安全 反射Reflection 內(nèi)建類(lèi)和方法 標(biāo)準(zhǔn)庫(kù) OO設(shè)計(jì) 網(wǎng)絡(luò)和Web庫(kù) Windows支持 內(nèi)嵌文檔 交互式Ruby Shell 支持 Ruby參考手冊(cè) Ruby首頁(yè) 卷首語(yǔ) Ruby的啟動(dòng) 環(huán)境變量 對(duì)象 類(lèi) 執(zhí)行 結(jié)束時(shí)的相關(guān)處理 線(xiàn)程 安全模型 正則表達(dá)式 字句構(gòu)造 程序 變量和常數(shù) 字面值 操作符表達(dá)式 控制結(jié)構(gòu) 方法調(diào)用 類(lèi)/方法的定義 內(nèi)部函數(shù) 內(nèi)部變量 內(nèi)部常數(shù) 內(nèi)部類(lèi)/模塊/異常類(lèi) 附加庫(kù) Ruby變更記錄 ruby 1.6 特性 ruby 1.7 特性 Ruby術(shù)語(yǔ)集 Ruby的運(yùn)行平臺(tái) pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
Figuren

執(zhí)行

Ruby 程序

Ruby程序的執(zhí)行就是對(duì)代碼進(jìn)行計(jì)算的過(guò)程。先編譯程序文本,遇到BEGIN就對(duì)其作出計(jì)算;然后計(jì)算頂層的一系列的表達(dá)式;若遇到END的話(huà),將在最后對(duì)其進(jìn)行處理然后結(jié)束程序(關(guān)于結(jié)束程序時(shí)處理步驟的詳細(xì)過(guò)程請(qǐng)參考結(jié)束程序時(shí)的相關(guān)處理)。

語(yǔ)句

if

if句的計(jì)算過(guò)程如下:先對(duì)條件表達(dá)式進(jìn)行計(jì)算,若為真則執(zhí)行相應(yīng)代碼段,若為假則依次計(jì)算elseif部分的條件表達(dá)式,若遇到值為真的表達(dá)式則執(zhí)行相應(yīng)的代碼段。若所有的條件表達(dá)式的值都為假的話(huà),就執(zhí)行else部分的代碼段。

語(yǔ)句的值取決于最后執(zhí)行的代碼塊的值。若最后的代碼塊中沒(méi)有表達(dá)式,或者所有條件表達(dá)式的值都是假而且沒(méi)有else部分的話(huà),則語(yǔ)句的值為nil。

until

if 修飾部分

unless 修飾部分

while

until

while 修飾部分

until 修飾部分

for

begin ~ end

類(lèi)定義句

定義類(lèi)的內(nèi)容。在執(zhí)行時(shí)(而并非編譯時(shí))進(jìn)行計(jì)算。

書(shū)寫(xiě)樣式

class ClassName [< 超類(lèi)表達(dá)式]
  表達(dá)式
end

在對(duì)類(lèi)定義句進(jìn)行計(jì)算時(shí),將先試圖生成類(lèi)。若有超類(lèi)表達(dá)式就加以計(jì)算,其值作為ClassName類(lèi)的父類(lèi),然后生成ClassName類(lèi)的實(shí)例.若沒(méi)有超類(lèi)表達(dá)式,就把Object作為其父類(lèi).

另一方面,若有同名類(lèi)的話(huà),就先使用那個(gè)同名類(lèi)。然后處理超類(lèi)表達(dá)式,若新生成的超類(lèi)(在equal?)有所不同的話(huà),就再生成一個(gè)新的類(lèi)。

得到類(lèi)之后就將其代入常數(shù)“ClassName”中,由此決定類(lèi)名。此時(shí),若同名的常數(shù)中被代入一個(gè)非Class的實(shí)例的話(huà),就會(huì)引發(fā)異常TypeError。

最后生成新的框架(frame),向頂層塊的self以及class設(shè)定要進(jìn)行定義的類(lèi),然后在框架的基礎(chǔ)上對(duì)定義句中的表達(dá)式進(jìn)行計(jì)算。我們無(wú)法得到類(lèi)定義句的值。

也就是說(shuō),在Ruby中我們可以多次“追加類(lèi)定義”。

模塊定義句

定義模塊的內(nèi)容。在執(zhí)行時(shí)(而并非編譯時(shí))進(jìn)行計(jì)算。

書(shū)寫(xiě)樣式

module ModuleName
  模塊內(nèi)容
end

對(duì)模塊定義句進(jìn)行計(jì)算時(shí),首先會(huì)生成新的無(wú)名模塊。但是,若已經(jīng)有了一個(gè)名為ModuleName的模塊的話(huà),就使用該模塊。此時(shí)就變成“追加模塊的定義”了。

得到模塊后就將其代入常數(shù)ModuleName中。這個(gè)常數(shù)就成為模塊的名稱(chēng)。此時(shí),若向同名常數(shù)代入非模塊的話(huà)就會(huì)引發(fā)異常TypeError。

最后生成新的框架(frame),向頂層塊的self以及class中設(shè)定模塊ModuleName,然后在框架的基礎(chǔ)上對(duì)定義句中的表達(dá)式進(jìn)行計(jì)算。模塊定義句的值就是模塊內(nèi)容的最后一個(gè)表達(dá)式的值。若模塊內(nèi)容中沒(méi)有可計(jì)算的表達(dá)式時(shí),其值為nil。

特殊類(lèi)定義句

定義對(duì)象的特殊類(lèi)。在執(zhí)行時(shí)(而并非編譯時(shí))進(jìn)行計(jì)算。

書(shū)寫(xiě)樣式

class << EXPR
  類(lèi)的內(nèi)容
end

先計(jì)算想定義特殊類(lèi)的對(duì)象的表達(dá)式EXPR。然后生成該對(duì)象的特殊類(lèi)(若尚未生成的話(huà))。最后生成新框架,向頂層塊的selfclass中設(shè)定新生成的特殊類(lèi)。在新框架的基礎(chǔ)上對(duì)定義句中的表達(dá)式進(jìn)行計(jì)算。

特殊類(lèi)定義句的值取決于類(lèi)的內(nèi)容中的最后一個(gè)表達(dá)式的值。若沒(méi)有可計(jì)算的表達(dá)式時(shí),其值為nil。

請(qǐng)注意,Fixnum Symbol的實(shí)例以及 true false nil 不能定義特殊類(lèi)

方法定義句

定義方法的內(nèi)容。在執(zhí)行時(shí)(而并非編譯時(shí))進(jìn)行計(jì)算。

書(shū)寫(xiě)樣式

def method_name(arg, argwithdefault=expr, *restarg, &block)
  方法內(nèi)容
end

對(duì)其進(jìn)行計(jì)算時(shí),將向運(yùn)行塊的class中定義該方法。若class中已經(jīng)存在同名的方法的話(huà),則拋棄舊方法,添加新方法。

方法定義句的值為nil。

特殊方法定義句

向?qū)ο蟮奶厥忸?lèi)中定義方法。在執(zhí)行時(shí)(而并非編譯時(shí))進(jìn)行計(jì)算。

書(shū)寫(xiě)樣式

def expr.method_name(arg, argwithdefault=expr, *restarg, &block)
  方法內(nèi)容
end

首先計(jì)算表達(dá)式expr。然后生成對(duì)象的特殊類(lèi)(若尚未生成的話(huà))。最后向特殊類(lèi)中定義方法method_name

特殊方法定義句的值為nil。

請(qǐng)注意,Fixnum Symbol的實(shí)例以及true false nil不能定義特殊方法。

BEGIN

編譯時(shí)會(huì)用到(執(zhí)行時(shí)首先計(jì)算)

END

編譯時(shí)會(huì)用到(執(zhí)行時(shí)最后計(jì)算)

方法

方法的調(diào)用

首先計(jì)算被調(diào)(receiver)表達(dá)式,得到被調(diào)用對(duì)象。省略被調(diào)表達(dá)式時(shí),調(diào)用塊的self將成為被調(diào)。

接下來(lái)從左到右地對(duì)參數(shù)表達(dá)式進(jìn)行計(jì)算,檢索被調(diào)里面的方法。若檢索失敗則引發(fā)異常NameError,成功的話(huà)就執(zhí)行方法。

另外,執(zhí)行方法的時(shí)候還可以添加塊(block)。若向方法添加塊時(shí),只有當(dāng)運(yùn)行中的方法執(zhí)行yield時(shí)才會(huì)對(duì)塊進(jìn)行計(jì)算。若沒(méi)有執(zhí)行yield的話(huà),塊將被忽視,不會(huì)執(zhí)行。

將塊傳給方法時(shí),該塊將會(huì)繼承調(diào)用方的塊的selfclass。只有Module#module_eval/class_eval和Object#instance_eval這三個(gè)例外,如下所示。

Module#module_eval, class_eval

self和class都是被調(diào)(receiver)

Object.instance_eval

self是被調(diào),class是被調(diào)的特殊類(lèi)

eval

Proc對(duì)象和Binding對(duì)象傳給eval的第二參數(shù)時(shí),將在生成時(shí)的塊的基礎(chǔ)上對(duì)字符串進(jìn)行計(jì)算。

方法的執(zhí)行

當(dāng)框架上只有一個(gè)塊的情況下,才開(kāi)始執(zhí)行方法。下面我們暫時(shí)把這個(gè)塊稱(chēng)作頂層塊(top level block)。頂層塊的self是被調(diào),class尚未被定義。

首先,若有必選參數(shù)的話(huà),就把得到值代入頂層塊的局部變量。

若存在可選參數(shù),且已被省略的話(huà),則在頂層塊上對(duì)默認(rèn)值表達(dá)式進(jìn)行計(jì)算,然后將得到的默認(rèn)值代入頂層塊的局部變量。若可選參數(shù)沒(méi)被省略的話(huà),就把得到的值代入頂層塊的局部變量。

若存在*args這樣的參數(shù)的話(huà),則將剩下的所有參數(shù)以數(shù)組的形式代入局部變量。

另外,若存在塊參數(shù)blockvar的話(huà),則將傳給方法的塊進(jìn)行Proc對(duì)象化,然后代入頂層塊的局部變量blockvar中。若沒(méi)向方法傳遞塊的話(huà),就代入nil。

接下來(lái)對(duì)方法內(nèi)容進(jìn)行計(jì)算,先計(jì)算方法層(method level)的rescue以及else部分,最后計(jì)算ensure部分。

整個(gè)方法的值取決于傳遞給return的值。若沒(méi)有調(diào)用return的話(huà),則取決于 方法內(nèi)容/rescue/else 中最后被計(jì)算的表達(dá)式的值。若三個(gè)都為空的話(huà),值為nil。

帶塊的方法調(diào)用

若向方法傳遞一個(gè)塊的話(huà),這個(gè)方法就叫做帶塊的方法。帶塊方法遇到y(tǒng)ield時(shí)會(huì)轉(zhuǎn)向塊。

可以使用塊參數(shù)。

break...若塊位于堆棧框架(stack frame)上的話(huà),就跳到框架的塊的后面。break并結(jié)束帶塊方法,其值為nil。若塊不在堆??蚣苌?,則引發(fā)異常LocalJumpError。

next 跳到塊的終點(diǎn)

retry 這個(gè)就復(fù)雜了...

eval, instance_eval, module_eval

賦值

賦值是指讓變量或常數(shù)記住某個(gè)對(duì)象。從語(yǔ)法的角度來(lái)看,雖然[]=和屬性賦值的方法調(diào)用看起來(lái)很像是賦值,但卻并非這里談到的賦值。

我們可以反復(fù)地將各種對(duì)象賦值給變量。也可以將各種對(duì)象賦值給常數(shù),但卻只能賦值一次。也就是說(shuō),一旦將對(duì)象賦值給常數(shù),就不能再更改。但這并不意味著賦值給常數(shù)的對(duì)象本身不允許更改,請(qǐng)您注意這點(diǎn)。

多重賦值

暫無(wú)

變量和常數(shù)

我們可以讓變量或常數(shù)記住一個(gè)對(duì)象。這叫做“變量(常數(shù))的賦值”。

當(dāng)對(duì)變量或常數(shù)進(jìn)行計(jì)算時(shí),它就會(huì)返回記住的對(duì)象。這叫做“變量(常數(shù))的調(diào)用”。

下面我們就分別來(lái)看一看變量和常數(shù)的賦值與調(diào)用過(guò)程。

局部變量

局部變量只屬于一個(gè)塊。塊是指與代碼的某個(gè)范圍相對(duì)應(yīng)的運(yùn)行時(shí)的結(jié)構(gòu),可以嵌套。具體說(shuō)來(lái),它伴隨帶塊的方法調(diào)用以及eval系方法的執(zhí)行而出現(xiàn)。我們只能在局部變量的所屬塊以及該塊的嵌套塊中對(duì)局部變量進(jìn)行賦值和引用。

同時(shí),塊被放在特定的“框架”上,并歸屬于該框架。因此,不能調(diào)用其他框架上的局部變量。所謂框架是指開(kāi)始執(zhí)行下列語(yǔ)句時(shí)生成的運(yùn)行時(shí)的結(jié)構(gòu)。

  • 程序文本的頂層(傳遞給ruby的文件名、-e、load)
  • 執(zhí)行方法
  • 類(lèi)/模塊的定義句
  • BEGINEND

生成框架時(shí)自動(dòng)搭載一個(gè)塊,因此可以在這些語(yǔ)句中使用局部變量。

編譯時(shí),寫(xiě)入程序代碼的局部變量將賦值給框架中的尚未定義的局部變量。局部變量被賦值時(shí)所在的塊就是它的歸屬塊。由此可知,編譯時(shí)局部變量的定義過(guò)程已經(jīng)完成(請(qǐng)注意,eval系的方法在執(zhí)行過(guò)程中進(jìn)行編譯)。定義的變量的初始值為nil。

局部變量在定義和調(diào)用時(shí),先是在塊中從外到內(nèi)地進(jìn)行搜索。其結(jié)果就是,局部變量不能進(jìn)行嵌套和屏蔽(shadowing)。但是,當(dāng)若干的塊處于非主從關(guān)系時(shí),其內(nèi)部可以包含不同的局部變量。

調(diào)用未定義(即沒(méi)有在代碼中標(biāo)出)的局部變量時(shí),Ruby會(huì)試圖把它當(dāng)作對(duì)self的(無(wú)參數(shù)的)方法調(diào)用來(lái)處理。若搜索方法失敗則引發(fā)異常NameError

再來(lái)看一下調(diào)用塊的執(zhí)行情況,塊也可以帶參數(shù),但常被看做是在將要執(zhí)行的塊上進(jìn)行的多重賦值.例如,下面代碼的塊在開(kāi)始執(zhí)行時(shí)

some_iterator do |a,b|
  ....
end

首先會(huì)進(jìn)行下列操作。

a, b = <some_iterator 被yield的值 >

實(shí)例變量

實(shí)例變量屬于一個(gè)對(duì)象,在self代表的塊的范圍內(nèi)可以進(jìn)行賦值和調(diào)用。實(shí)例變量的賦值過(guò)程同時(shí)也就是該變量的定義過(guò)程,若調(diào)用未定義的實(shí)例變量則返回nil。

remove_instance_variable

類(lèi)變量

類(lèi)變量為一個(gè)特定的類(lèi)、該類(lèi)的子類(lèi)以及該類(lèi)的實(shí)例所擁有。在以這些對(duì)象為self的塊的范圍內(nèi),可對(duì)其進(jìn)行賦值和調(diào)用。最初的賦值過(guò)程也兼做定義。若調(diào)用一個(gè)未經(jīng)定義的類(lèi)變量的話(huà)就會(huì)引發(fā)異常NameError。

類(lèi)變量的繼承和“繼承中止”

全局變量

在任何地方都可以對(duì)全局變量進(jìn)行賦值和調(diào)用。最初的賦值過(guò)程兼做變量的定義,若調(diào)用一個(gè)未經(jīng)定義的全局變量的話(huà),就會(huì)返回nil。

可跟蹤(?)

常數(shù)

常數(shù)屬于類(lèi)/模塊。我們可以使用除method以外的方式對(duì)其進(jìn)行賦值。最初的賦值兼做定義。對(duì)常數(shù)賦值時(shí)所在的塊的class就是常數(shù)的歸屬類(lèi)。有個(gè)非常特殊的例外,我們可以使用Module#const_set方法來(lái)定義常數(shù),同時(shí),還可以使用Module#remove_const來(lái)取消常數(shù)。

無(wú)法對(duì)已定義的常數(shù)進(jìn)行再定義或賦值。實(shí)際上,只使用警告還可以進(jìn)行賦值,但這只是一時(shí)的應(yīng)急措施,并不符合規(guī)范。所以要少寫(xiě)這樣的程序。

可調(diào)用范圍因?qū)懛ú煌兴町悺?/p>

只寫(xiě)出常數(shù)名時(shí) (例: Const)

可調(diào)用范圍有:常數(shù)所屬的類(lèi)、子類(lèi)、嵌套類(lèi)的框架內(nèi)的代碼

寫(xiě)出完整路徑時(shí) (例: Mod::Cls::Const)

可在任何地方調(diào)用

另外,像"::Const"這種前置"::"的寫(xiě)法,只有寫(xiě)成"Object::Const"時(shí)才能進(jìn)行調(diào)用。

偽變量

下面這些變量看起來(lái)好像是局部變量,但實(shí)際上是保留字,返回確定的值。不可賦值。

self

返回該塊的self。

nil

返回NilClass的唯一的實(shí)例--nil。

true

返回TrueClass的唯一的實(shí)例--true。

false

返回FalseClass的唯一的實(shí)例--false。


Vorheriger Artikel: N?chster Artikel: