<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評(píng)論-1047  文章-0  trackbacks-0
    Q: 什么是閉包(Closure)?
    A: 我們可以把closure簡(jiǎn)單地理解為語(yǔ)句塊,下面讓我們來看一下方法聲明和closure定義的相似點(diǎn):
    方法聲明:
    def?sayHello(name)?{
    ????println?name
    }

    sayHello(
    "山風(fēng)小子")

    closure定義:
    def?sayHello?=?{?name?->
    ????println?name
    }

    sayHello(
    "山風(fēng)小子")

    通過代碼比較,大家看出相似點(diǎn)了吧。
    closure比方法更靈活,可以作為參數(shù)傳入方法(這點(diǎn)類似于C++中的方法指針),而方法比如本例中的sayHello方法可以通過.&操作符來獲得方法閉包
    def?sayHello(name)?{
    ????println?name
    }

    def?sayHelloMethodClosure?
    =?this.&sayHello
    sayHelloMethodClosure(
    "山風(fēng)小子")

    def hello(c) {
    ??? c("Daniel")
    }

    hello(sayHelloMethodClosure)

    所以在Grails中大量的使用clsoure。


    Q: ?.是什么

    A: ?. 是‘安全引用符’,舉例來說:
    在Java中,為了程序的魯棒性(robust),在對(duì)一個(gè)對(duì)象進(jìn)行操作之前,我們會(huì)判斷它是否為null
    if?(null?!=?obj)?{
    ??obj.doSomething();
    }

    而在Groovy就方便多了,您可以用?.來達(dá)到上面的目的
    obj?.doSomething()

    等價(jià)于
    obj?==?null???null?:?obj.doSomething()
    如果obj為null,則obj?.doSomething()的結(jié)果為null,否則就正常執(zhí)行與Java無異:)

    實(shí)例:
    def?obj?=?null
    println?obj
    ?.hello()?//?打印出null
    由于obj為null,所以就不執(zhí)行hello(),即便obj中沒有定義hello這個(gè)方法也不會(huì)報(bào)錯(cuò) :)


    Q: it是什么?
    A: 如果您沒有在Groovy的Closure中定義任何變量,那么Groovy會(huì)自動(dòng)幫您定義一個(gè)it變量。
    舉例來說:
    //?此處的a為自己定義的變量
    def?c?=?{?a?->?
    ????println?a
    }
    c(
    "Hello,?world")

    注意上下兩段代碼的區(qū)別,下面的Closure沒有定義任何變量,當(dāng)要引用傳入的參數(shù)時(shí),用it來表示
    //?此處的it是Groovy自動(dòng)幫我們定義的變量
    def?c?=?{
    ????println?it
    }
    c(
    "Hello,?world")


    Q: @Property是什么?
    A: 這是以前舊版Groovy的寫法,用來定義成員變量,但由于大家反應(yīng)它太丑了,所以在Groovy1.0+中已不建議使用,請(qǐng)用def替代它。


    Q: 如何定制closure的字符串表示?
    A: 定制類的字符串表示一般是通過重寫(override)toString方法來完成的:
    class?A?{
    ????String?toString()?{
    ????????
    "I?am?A"
    ????}
    }

    def?a?
    =?new?A()
    println?
    "$a"

    但定制closure的字符串表示,則稍微特殊一點(diǎn),是通過it << "closure的字符串表示",
    在Groovy1.1中,"$closure"會(huì)將StringWriter的一個(gè)實(shí)例傳給closure的隱式變量it,并引起closure的執(zhí)行
    如果僅僅是closure()的話,并不會(huì)有StringWriter實(shí)例傳給closure的隱式變量it
    def?c?=?{
    ????println?
    "closure?is?executed."
    ???
    // 將這條語(yǔ)句看作toString方法就可以了,注意要使用if (it) {}來判斷一下 :)
    ???
    if (it) {
    ??????? it?<<?"I?am?a?closure?c"
    ??? }
    }

    println?
    "$c"

    結(jié)果如下所示,閉包c(diǎn)先被執(zhí)行,然后才執(zhí)行println打印出closure的字符串表示
    closure?is?executed.
    I?am?a?closure?c



    Q: 出現(xiàn)在閉包中的owner是什么?
    A: owner其實(shí)就是‘擁有’此閉包的一個(gè)對(duì)象,舉例來說:
    class?A?{
    ????def?c?
    =?{
    ?????????println?
    "c's?owner:?$owner"
    ????????
    if?(it)?{
    ????????????it?
    <<?"closure?c"
    ????????}

    ????????def?innerC?
    =?{
    ????????????println?
    "innerC's?owner:?$owner"
    ????????}
    ????}

    ????String?toString()?{
    ????????
    'class?A'
    ????}
    }
    def?a?
    =?new?A()
    def?innerC?
    =?a.c()
    innerC()
    運(yùn)行結(jié)果:
    c's?owner:?class?A
    c's?owner:?class?A
    innerC's?owner:?closure?c


    Q: 為什么Grails比Rails更適用于企業(yè)應(yīng)用?(摘自《對(duì)Grails之誤解》)
    A: 原因很多,最顯著的兩個(gè)原因就是Spring和Hibernate。到目前為止,有不計(jì)其數(shù)的組織在采用Spring和HIbernate,他們都有既有的Spring上下文環(huán)境,以及已經(jīng)構(gòu)造好的Hibernate領(lǐng)域?qū)ο蟮取?br />
    在我開始參與Grails項(xiàng)目之前,我就經(jīng)歷過同樣的情況。我們?cè)O(shè)計(jì)Grails的目的就是為了讓它和這些框架盡可能無縫地整合起來。因此,我們打個(gè)比方,你可以把一個(gè)用Java編寫的Hibernate領(lǐng)域模型及其對(duì)應(yīng)的配置文件直接扔進(jìn)Grails應(yīng)用中,然后就可以使用動(dòng)態(tài)的查詢方法,并且直接使用GORM了。

    此外,Grails控制器使用了標(biāo)準(zhǔn)的Servlet API對(duì)象(如request、response和session等),因此可以和其它的Servlet一起使用。畢竟,掀起它的蓋頭之后,我們會(huì)發(fā)現(xiàn)它不過是一個(gè)Spring MVC應(yīng)用。另一方面,Rails幾乎是按照和EJB2一樣的方式設(shè)計(jì)的(在我發(fā)現(xiàn)這點(diǎn)時(shí),怎一個(gè)“震驚”二字了得!)。也就是說,你在擴(kuò)展 ActiveController和ActiveRecord等框架對(duì)象時(shí),你也就被綁定在了這套框架上。

    在Rails里面根本就不存在領(lǐng)域模型的說法,Rails的模型就是數(shù)據(jù)庫(kù)表。這當(dāng)然是一件好事了,但在企業(yè)內(nèi)部,同一個(gè)領(lǐng)域模型可能會(huì)在許多不同的應(yīng)用中服用,比如說桌面應(yīng)用和Web應(yīng)用。在Java里,這實(shí)際上是非常成熟完善的,通過把類對(duì)象及相應(yīng)映射文件打包成一個(gè)JAR文件即可。

    Q: 用Grails開發(fā)的Web應(yīng)用如何進(jìn)行部署?
    A: 執(zhí)行‘grails war’將Web應(yīng)用打成war包,然后就可以將應(yīng)用部署到任何符合J2EE規(guī)范的Web服務(wù)器上了。


    To be continued...

    附:朝花夕拾——Groovy & Grails
    posted on 2007-04-28 16:21 山風(fēng)小子 閱讀(2276) 評(píng)論(5)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 国产精品极品美女自在线观看免费 | 亚洲国产精品无码av| 亚洲另类无码一区二区三区| 免费人成黄页在线观看日本| 免费a级黄色毛片| 97久久国产亚洲精品超碰热| 黄网站免费在线观看| jizzjizz亚洲| 亚洲精品国产综合久久久久紧| 亚洲视频在线免费看| 亚洲色无码一区二区三区| 亚洲AV性色在线观看| 麻豆视频免费观看| 亚洲AV无码成人精品区蜜桃| 免费人成动漫在线播放r18| 最新猫咪www免费人成| 亚洲精品熟女国产| 成全动漫视频在线观看免费高清版下载| 免费看男女下面日出水视频| 久久夜色精品国产噜噜亚洲a| 999久久久免费精品播放| 亚洲国产另类久久久精品小说| 黄网站色成年片大免费高清| 妞干网免费视频在线观看| 亚洲人色大成年网站在线观看| 久久久久久久99精品免费| 亚洲精品无码成人AAA片| 丰满妇女做a级毛片免费观看 | 亚洲国产精品13p| 国产精品亚洲а∨无码播放不卡 | 国产国产人免费视频成69大陆| 亚洲六月丁香婷婷综合| 免费观看激色视频网站(性色)| 久久水蜜桃亚洲av无码精品麻豆| 大地资源中文在线观看免费版| 中文字幕亚洲一区| 好猛好深好爽好硬免费视频| 国产精品亚洲精品日韩已方| 一级女性全黄久久生活片免费| 亚洲成a人片在线观看国产| 污网站在线观看免费|